2017-06-16 14 views
1

を構築私は多くの型の宣言を持っているタイプ

Prelude> let bess = First (CowInfo "Bess" 4) :: Animal' 
Prelude> let elmer' = Second (SheepInfo "Elmer" 5 5) 

それが来るどのように、最初はタイプbess :: Animal'と第二elmer' :: Sum a SheepInfoなること?

+1

これはあなたの質問とは関係ありませんが、あなたは 'モジュールSumProduct where'の下ですべてをインデントする必要はないことを知りたいかもしれません。列0の次の行を開始するだけで、そこにすべてのトップレベルの宣言を残すことができます。 – dfeuer

答えて

5

デフォルトでは、Haskellは式に適用される最も一般的な型を推論します。

ここでは、GHCに直接どのタイプがあるのか​​を伝えるので、入力したタイプが有効かどうかをチェックしますが、最も一般的なタイプよりも具体的にすることができます。あなたが明示的にbessが(それは言語構造ではなく、標準ライブラリで定義された実際の作業です)::オペレータによってAnimal'を入力したことをGHCに伝えるので

は、GHCはすでにbess :: Animal'ことを知っています。しかし、elmer'のタイプを指定しなかったため、GHCは最も一般的なタイプを見つけ出します。この場合

GHCが知っているすべてはSecondコンストラクタはSheepInfoがかかりますが、Firstが取るべきもののないアイデアを持っていないということですので、最も一般的なタイプはSum a SheepInfoです。したがって、それは型変数aにそれを推論します。

+0

「最も一般的なタイプ」とはどういう意味ですか?例を挙げてください。 –

+0

私が最も一般的なタイプと呼ぶのは、データに関する情報が少ないと仮定するタイプです。たとえば、Haskellで数値リテラルを入力すると、 '23'のように' Num a => a'に推論されます。これは '2 * 0.5'を実行できる理由です:' 2'は 'Int'ではなく、右側の数値に適応します。この場合、浮動小数点数です。 – baxbaxwalanuksiwe

関連する問題