Prelude> let bess = First (CowInfo "Bess" 4) :: Animal'
Prelude> let elmer' = Second (SheepInfo "Elmer" 5 5)
それが来るどのように、最初はタイプbess :: Animal'
と第二elmer' :: Sum a SheepInfo
なること?
Prelude> let bess = First (CowInfo "Bess" 4) :: Animal'
Prelude> let elmer' = Second (SheepInfo "Elmer" 5 5)
それが来るどのように、最初はタイプbess :: Animal'
と第二elmer' :: Sum a SheepInfo
なること?
デフォルトでは、Haskellは式に適用される最も一般的な型を推論します。
ここでは、GHCに直接どのタイプがあるのかを伝えるので、入力したタイプが有効かどうかをチェックしますが、最も一般的なタイプよりも具体的にすることができます。あなたが明示的にbess
が(それは言語構造ではなく、標準ライブラリで定義された実際の作業です)::
オペレータによってAnimal'
を入力したことをGHCに伝えるので
は、GHCはすでにbess :: Animal'
ことを知っています。しかし、elmer'
のタイプを指定しなかったため、GHCは最も一般的なタイプを見つけ出します。この場合
GHCが知っているすべてはSecond
コンストラクタはSheepInfo
がかかりますが、First
が取るべきもののないアイデアを持っていないということですので、最も一般的なタイプはSum a SheepInfo
です。したがって、それは型変数a
にそれを推論します。
「最も一般的なタイプ」とはどういう意味ですか?例を挙げてください。 –
私が最も一般的なタイプと呼ぶのは、データに関する情報が少ないと仮定するタイプです。たとえば、Haskellで数値リテラルを入力すると、 '23'のように' Num a => a'に推論されます。これは '2 * 0.5'を実行できる理由です:' 2'は 'Int'ではなく、右側の数値に適応します。この場合、浮動小数点数です。 – baxbaxwalanuksiwe
これはあなたの質問とは関係ありませんが、あなたは 'モジュールSumProduct where'の下ですべてをインデントする必要はないことを知りたいかもしれません。列0の次の行を開始するだけで、そこにすべてのトップレベルの宣言を残すことができます。 – dfeuer