Learn You a Haskellの第 11 章では、次の定義が紹介されています。
instance Applicative ((->) r) where
pure x = (\_ -> x)
f <*> g = \x -> f x (g x)
ここで、著者は特徴のない手を振っています (「<*> のインスタンスの実装は少し不可解なので、[説明せずに実際に表示する] だけにするのが最善です」)。ここの誰かが私がそれを理解するのを手伝ってくれることを願っています。
適用可能なクラス定義によると、(<*>) :: f (a -> b) -> f a -> f b
((->)r)
インスタンスでは、次のように置き換えますf
。r->(a->b)->(r->a)->(r->b)
最初の質問は、その型から にどうやって取得するf <*> g = \x -> f x (g x)
かということです。
しかし、最後の式を当然のことと思っていても、GHCi に与えた例と一致させるのに苦労しています。例えば:
Prelude Control.Applicative> (pure (+5)) <*> (*3) $ 4
17
代わりに、この式はf <*> g = \x -> f (g x)
(このバージョンでは のx
後に表示されないことに注意してくださいf
。
ごちゃごちゃしていると思いますので、よろしくお願いします。