簡體   English   中英

在 Haskell 中使用函子、應用程序和 monad 進行練習

[英]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變量,展示如何使這種類型成為FunctorApplicativeMonad類的實例。 借助示例,解釋此類型的>>=運算符的作用。”

我找到了第一個問題的解決方案,與這里相同: https : //github.com/evturn/programming-in-haskell/blob/master/12-monads-and-more/12.05-exercises.hs (例 7),即類型正確。

問題是我無法找出這個練習的意義以及這個解決方案實際做什么的意義。

要理解解決方案,您需要對FunctorApplicativeMonad有一個直覺。

話雖fmap<*>>>=只是一種能夠在任意F中轉換數據的方法,在您的情況下,它是來自a -> bExpr

例如,看看FunctorApplicativeMonad的 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為輸入其他適用的任意fsomething ,使得f是從改造a -> Maybe b這滿足的定義>>=組合子即ma -> (a -> mb) -> mb其中mMaybe數據類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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