ここで、他の人の回答について詳しく説明します。
のソースコードの中Control.Applicative
に
instance Applicative ((->) a) where -- (a ->) is meant here
pure = const
(<*>) f g x = f x (g x)
liftA3 f a b c = f <$> a <*> b <*> c
GHCiでは、
Prelude Control.Applicative> :t liftA3 (,,)
liftA3 (,,) :: (Applicative f) => f a -> f b -> f c -> f (a, b, c)
したがって、(t->)
asを使用するとf
、次のliftA3 (,,)
ように機能します。
liftA3 (,,) ~ (t->a) -> (t->b) -> (t->c) -> (t->(a,b,c))
つまり、同じ型の入力に対して 3 つの関数が与えられた場合、 を呼び出すとliftA3 (,,) f1 f2 f3 t
triple が生成されます。(f1 t, f2 t, f3 t)
Prelude Control.Applicative>
liftA3 (,,) (:[]) (quot 12) (`rem`3) 4
([4],3,1)
それで、それはどのように機能しますか?の定義によりliftA3
、そして の<*>
、
liftA3 (,,) f g h t = ((((,,) <$> f) <*> g) <*> h) t
= (((,,) <$> f) <*> g) t (h t)
= (((,,) <$> f) t (g t) (h t)
さて、(<$>) = fmap
と をinstance Functor ((->) t)
定義するfmap = (.)
ので、続けます
= (((,,) . f) t (g t) (h t)
= (,,) (f t) (g t) (h t)
= (f t, g t, h t)