9

ちょっと前からHaskellを勉強している初心者です。

次のコードは非常に簡単に理解できます。

purStrLn $ show [1]

ここでは、すべてのタイプを (デフォルトで) 推測でき、すべてがうまく機能します。ただし、次のコードも機能します。

putStrLn $ show []

リストの型を推測できない場合でも。

ghci でコードを実行すると、次の結果が得られます。

Prelude> []
[]
Prelude> :t it
it :: [a]
Prelude> 

そのため、型はポリモーフィックのようです。ただし、この場合、ショーは部分的に適用された型で呼び出されます。

Data.Map.empty など、他のタイプでも同じ動作が一般的であるため、リスト機能ではありません (または、少なくともそのように見えます)。

なぜ、どのように機能するのですか?

4

1 に答える 1

16

まず、これは でのみ機能しghciます。このプログラムをコンパイルしようとするとghc、型エラーが発生します。

Test.hs:3:19:
    Ambiguous type variable `a0' in the constraint:
      (Show a0) arising from a use of `show'
    Probable fix: add a type signature that fixes these type variable(s)
    In the second argument of `($)', namely `show []'
    In the expression: putStrLn $ show []
    In an equation for `main': main = putStrLn $ show []

型シグネチャを追加すると、エラーがなくなります。

module Main where

main = putStrLn $ show ([]::[Int])

しかし、なぜそれが機能したのghciですか?答えは拡張タイプのデフォルトですghci: のタイプaはデフォルトで()(ユニットタイプ) に設定されています。

この動作の動機は、ユーザーがインタープリターで作業するときに常に型を指定するのは少し面倒だからです。コメントで Vitus が指摘しているように、で実行ghciする-Wall(または に追加:set -Wallする~/.ghci) と、デフォルト設定を簡単に見つけることができます。

<interactive>:2:12:
    Warning: Defaulting the following constraint(s) to type `()'
               (Show a0) arising from a use of `show'
    In the second argument of `($)', namely `show []'
    In a stmt of an interactive GHCi command: it <- putStrLn $ show []
于 2013-04-18T14:38:35.870 に答える