在Haskell中使用仿函数,施加函数和单子进行运动

时间:2019-01-25 17:09:35

标签: haskell

我正在从《 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),类型正确。

问题是我无法找出这项练习的意义以及该解决方案实际作用的含义。

1 个答案:

答案 0 :(得分:0)

要了解该解决方案,您需要对FunctorApplicativeMonad有所了解。

话虽这么说fmap<*>>>=只是一种能够在您的情况下将任意F内的数据转换为{来自Expr的{​​1}}

例如,查看a -> bFunctorApplicative的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 bm数据类型。 / p>