5

最終的な署名がどのように推測されるかを理解しようとしています。

GHCi> :t (+)
(+) :: Num a => a -> a -> a
GHCi> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
GHCi> :t (<*>) (+)
(<*>) (+) :: Num b => (b -> b) -> b -> b

(a' -> a' -> a')と統合する必要がf (a -> b)あるので、fおそらくタイプ((->) r)です:

(<*>) :: Applicative ((->) r) => r -> (a -> b) -> (r -> a) -> (r -> b)
(<*>) (+) ~ a' -> (a' -> a') -> (a' -> a') -> (a' -> a')
(<*>) (+) :: (a' -> a') -> (a' -> a') -- ^^^ got stuck here

誰かが最終的なタイプを取得する方法を説明できますか?

ありがとう。

4

1 に答える 1

12

あなたが抱えている問題は、 の正しい結合性にあり->ます。のタイプを考えてみましょう<*>:

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

f a等しいとr -> a

<*> :: f (a -> b) -> f a -> f b
    :: (r -> (a -> b)) -> (r -> a) -> (r -> b)
    :: (r -> a -> b) -> (r -> a) -> (r -> b) -- This is the key line

ではなくから(r -> (a -> b)) -> other stuffになったことに注意してください。内側の括弧は矢印の右側にあるため削除できますが、外側の括弧は矢印の左側にあるため削除できません。(r -> a -> b) -> other stuffr -> (a -> b) -> other stuff

さて、(+) :: (Num a) => a -> a -> a. <*>これは、 when ris the same as ais the same asの最初の引数に完全に適合しb、それらはすべて数値です。一緒に、私たちはそれを理解します

(<*>) (+) :: (Num a) => (a -> a) -> (a -> a)
          :: (Num a) => (a -> a) -> a -> a

矢印の左側ではなく、右側の括弧を削除していることにもう一度注意してください。

于 2012-08-22T17:41:08.057 に答える