haskell - 在 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),即类型正确。
问题是我无法找出这个练习的意义以及这个解决方案的实际意义。
解决方案
要理解解决方案,您需要对 a Functor
、 anApplicative
和 a 有一个直觉Monad
。
话虽这么说fmap
,这只是一种能够在您的情况下任意转换数据的方法<*>
,即来自>>=
F
Expr
a -> 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
尽管从更大的角度来看,这些函数还执行具有类型类实例的代数数据类型的效果。
例如,我将提供Maybe
monad 的粗略定义。
instance Monad Maybe where
(Just something) >>= f = f something
Nothing >>= _ = Nothing
在这种情况下,如果有输入,则绑定或>>=
组合器返回,否则它将任意应用于这样的转换,该转换满足组合器的定义,即数据类型在哪里。Nothing
Nothing
f
something
f
a -> Maybe b
>>=
m a -> (a -> m b) -> m b
m
Maybe
推荐阅读
- python - 将列表对象缩短为仅数字并在 Python 中创建新列表
- hibernate - Hibernate 提取错误数据类型的值
- python - 如何在 Python 中从非多部分电子邮件创建多部分电子邮件?
- selenium - 无法通过 winium.desktop.driver 在窗格内找到窗格。无法识别窗格内的元素
- android - 正在进行的通知未取消
- r - R数据框所有面向字符串的coocuring单词列-创建coocurences-bigram-dplyr
- javascript - Angular 7 业力测试与导入外部 JS 模块
- azure - 无法在 MS Azure 上创建包含自定义图像的池
- python - 如何使用指向对象的字段可点击链接制作管理员 change_view
- sql - 变量声明 (SQL Server)