我正在从《 Haskell编程(第二版)》一书中进行练习,在理解以下内容时遇到一些问题:
“给出以下类型的表达式
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),类型正确。
问题是我无法找出这项练习的意义以及该解决方案实际作用的含义。
答案 0 :(得分:0)
要了解该解决方案,您需要对Functor
,Applicative
和Monad
有所了解。
话虽这么说fmap
,<*>
和>>=
只是一种能够在您的情况下将任意F
内的数据转换为{来自Expr
的{1}}
例如,查看a -> b
,Functor
和Applicative
的Type类定义。
Monad
尽管从总体上看,这些函数还执行具有类型类实例的代数数据类型的效果。
例如,我将提供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
在这种情况下,如果输入有instance Monad Maybe where
(Just something) >>= f = f something
Nothing >>= _ = Nothing
,bind或>>=
组合器将返回Nothing
,否则它将在Nothing
上应用任意的f
something
是对f
的转换,它满足a -> Maybe b
组合符的定义,>>=
其中m a -> (a -> m b) -> m b
是m
数据类型。 / p>