簡體   English   中英

簡單的應用函數示例

[英]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


一個更具象征意義的appraoch

許多人在用象征性思考這些問題時會報告更好的長期成功。 而不是通過問題提供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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM