首页 > 解决方案 > 在 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),即类型正确。

问题是我无法找出这个练习的意义以及这个解决方案的实际意义。

标签: haskell

解决方案


要理解解决方案,您需要对 a Functor、 anApplicative和 a 有一个直觉Monad

话虽这么说fmap,这只是一种能够在您的情况下任意转换数据的方法<*>,即来自>>=FExpra -> b

Functor例如,看一下 的 Type 类Applicative定义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

尽管从更大的角度来看,这些函数还执行具有类型类实例的代数数据类型的效果。

例如,我将提供Maybemonad 的粗略定义。

instance Monad Maybe where
    (Just something) >>= f = f something
    Nothing          >>= _ = Nothing

在这种情况下,如果有输入,则绑定或>>=组合器返回,否则它将任意应用于这样的转换,该转换满足组合器的定义,即数据类型在哪里。NothingNothingfsomethingfa -> Maybe b>>=m a -> (a -> m b) -> m bmMaybe


推荐阅读