[英]Exercise with functor, applicative and monads in Haskell
我正在做《Haskell 編程(第 2 版)》一書中的練習,但在理解以下內容時遇到了一些問題:
"給定以下類型的表達式
data Expr a = Var a | Val Int | Add (Expr a) (Expr a)
deriving Show
包含某種類型a
變量,展示如何使這種類型成為Functor 、 Applicative和Monad類的實例。 借助示例,解釋此類型的>>=
運算符的作用。”
我找到了第一個問題的解決方案,與這里相同: https : //github.com/evturn/programming-in-haskell/blob/master/12-monads-and-more/12.05-exercises.hs (例 7),即類型正確。
問題是我無法找出這個練習的意義以及這個解決方案實際做什么的意義。
要理解解決方案,您需要對Functor
、 Applicative
和Monad
有一個直覺。
話雖fmap
, <*>
和>>=
只是一種能夠在任意F
中轉換數據的方法,在您的情況下,它是來自a -> b
的Expr
例如,看看Functor
、 Applicative
和Monad
的 Type 類定義。
class Functor f where
fmap :: (a -> b) -> f a -> f b
class Functor f => Applicative f where
<*> :: f (a -> b) -> f a -> f b
class Applicative m => Monad m where
>>= :: m a -> (a -> m b) -> m b
盡管從更大的角度來看,這些函數還執行具有類型類實例的代數數據類型的效果。
例如,我將提供Maybe
monad 的粗略定義。
instance Monad Maybe where
(Just something) >>= f = f something
Nothing >>= _ = Nothing
在此背景下,綁定或>>=
組合子返回Nothing
如果Nothing
為輸入其他適用的任意f
上something
,使得f
是從改造a -> Maybe b
這滿足的定義>>=
組合子即ma -> (a -> mb) -> mb
其中m
是Maybe
數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.