4

haskellの型アノテーションに疑問があります。適用可能なファンクターについて読んで、私は見つけました:

pure (+) <*> Just 3 

Just (+3)これはタイプの どれを返しMaybe (a->a)ます。今の署名<*>

 (<*>) :: Applicative f => f (a -> b) -> f a -> f b

つまりf b、上記の例では、をとに置き換えfて取得されます。Maybeba->a

そして、ここで私は、私が知る限り、b(特定の用語を使用していない場合は申し訳ありませんが、それらが十分に明確であることを願っています)と統合できないため、ちょっと驚いていましたa->a

それは、私たちが内部にいてアプリケーションファンクターであるという理由だけで可能ですか、それとも私が見逃している何かが他にあるという理由で可能ですか?

4

2 に答える 2

11

bは(n制約のない)型変数であるため、常にすべての型と統合できます。ファンクターとは何の関係もありませんApplicative。型変数を型と統合する必要がある場合はどこでも機能します。

大まかに言って、2つの型式を統合すると、統合のどちらのパートナーよりも一般的ではない最も一般的な型式になります。2つの型式の一方が他方よりも一般的である場合、統合は常に成功し、統合のより具体的なパートナーになります。すべての型式の中で最も一般的なのは、構造がまったくない型変数です。したがって、型変数をその型式でインスタンス化することにより、型変数を任意の型式と統合できます(種類が一致する場合、種類が一致する型変数は*、もちろん、種類が種類である型式と統合することはできませんMaybe* -> *

于 2013-01-29T13:04:10.380 に答える
7

:t pure (+)

pure (+) :: (Num a, Applicative f) => f (a -> a -> a)

に注意してくださいf(a -> a -> a)

だから:t (<*>)_

(<*>) :: Applicative f => f (a -> b) -> f a -> f b

f ( a -> b)実際にはf ( a -> a -> a)です。

bしたがって、この場合の型変数 a -> a

于 2013-01-29T12:55:41.543 に答える