的下面是對對方的回答一些闡述在這裏。
源代碼中的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->)
爲f
,liftA3 (,,)
只是工作:
liftA3 (,,) ~ (t->a) -> (t->b) -> (t->c) -> (t->(a,b,c))
即,調用liftA3 (,,) f1 f2 f3 t
上同類型的輸入產生三(f1 t, f2 t, f3 t)
,給出三個功能:
Prelude Control.Applicative>
liftA3 (,,) (:[]) (quot 12) (`rem`3) 4
([4],3,1)
那麼,它是如何工作的?截至liftA3
的definiton,再<*>
,
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)
順便說一句,不要使用'quot'和'mod'一起。使用''''和'rem'(或者只是'quotRem')或者使用'div'和'mod'(或者使用'divMod')。這些配對具有保證,即「Rem m n =(q,r)」意味着'n * q + r = m'(對於'divMod'也是如此)。 –
好的,謝謝! –
爲什麼有兩雙,順便說一句? –