[英]a simple generalisation of the Applicative (Functor) type-class; pattern matching on constructors
[英]Simple Applicative Functor Example
我正在讀“了解你一本哈斯克爾”一書。 我很難理解這個應用程序的編碼器代碼:
(*) <$> (+3) <*> (*2) $ 2
這歸結為:(3 + 2)*(2 * 2)= 20
我不遵循如何。 我可以將上面的內容擴展為不那么優雅但更明確的新手理解版本:
((fmap (*) (+3)) <*> (*2)) 2
我理解<*>
運算符的基礎知識。 這很有道理:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
但我不知道命令是如何工作的? 有小費嗎?
處理這類問題的一種方法是使用替代。 在這種情況下,使用運算符(<*>)
或函數,獲取其實現並將其插入到相關代碼中。
在的情況下(*) <$> (+3) <*> (*2) $ 2
您所使用的((->) a)
的實例Applicative
中發現的Applicative
在基本模塊 ,可以發現實例通過單擊右側的源鏈接並搜索“( - >”:
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
使用(<*>)
的定義,我們可以繼續替換:
((fmap (*) (+3)) <*> (*2)) 2 == (fmap (*) (+3)) 2 ((*2) 2)
== (fmap (*) (+3)) 2 4
好了,我們需要((->) a)
的Functor實例。 您可以通過為黑線鱈信息發現這個Functor
, 在這里點擊右邊的源鏈接,並搜索“( - >”中找到:
instance Functor ((->) r) where
fmap = (.)
現在繼續代替:
(fmap (*) (+3)) 2 4 == ((*) . (+3)) 2 4
== (*) ((+3) 2) 4
== (*) 5 4
== 20
許多人在用象征性思考這些問題時會報告更好的長期成功。 而不是通過問題提供2值,而是將焦點放在(*) <$> (+3) <*> (*2)
並且僅在末尾應用2。
(*) <$> (+3) <*> (*2)
== ((*) . (+3)) <*> (*2)
== (\x -> ((*) . (+3)) x ((*2) x))
== (\x -> ((*) . (+3)) x (x * 2))
== (\x -> (*) (x + 3) (x * 2))
== (\x -> (x + 3) * (x * 2))
== (\x -> 2 * x * x + 6 * x)
好的,現在插入2 for x
2 * 2 * 2 + 6 * 2
8 + 12
20
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.