私はちょうどハスケルを学び始めました。 Haskellは静的入力されおよび多形型推論を有するように、識別関数の種類はハスケル型推論について混乱します
IDは、そのパラメータとして任意の型を取り、それ自体を返すことができ示唆id :: a -> a
あります。私がしようとすると、それが正常に動作します:
a = (id 1, id True)
私は、コンパイル時に、最初のIDはテンキーであると仮定:: - >、および第2のIDがブール値である - >ブール。それは
result = foo id 1 2
で正常に動作しますしかし、それは事実であることから、
foo f a b = (f a, f b)
result = foo id 1 True
それはBと同じタイプでなければならないの種類を示しています。私は、次のコードをしようとすると、それはエラーを出しますidのパラメータの型は多相であるため、aとbは異なる型になる可能性があります。
が何をしたいhttp://stackoverflow.com/questions/32496864/what-is-the-monomorphism-restrictionですか? – hao
@haoformayorいいえ、これは「フォーオール」についてのことですが、単相性の制限ではありません。 AFAIK haskellは、 'forall'を持つ型を推論することはありません(rank()と呼ばれます)。' 'foo''の型は' '(forall a.a - > a) -2種類、私は思いますか?)、monomorphismの制限を無効にしても。 – amalloy
ああ、それは答えです。 ghcは、ランク1型のforall a bを推論します。 (a - > b) - > a - > a - >(b、b) 'ですが、本当に' 'a a - > a - > a - > b - >(a、b)'が必要です。 – hao