haskell - fmap (+3) (*3) 不应该等同于 \x -> ((x+3)*3) 吗?
问题描述
在Learn you a Haskell中,给出了
fmap (+3) (*3)
相当于
\x -> ((x*3)+3))
但是,我不明白为什么。不应该是\x -> ((x+3)*3)
吗?
我不知道fmap
for (*3)
functor 的实现,但是我的直觉告诉我,由于 functor(*3)
等价于\x -> x * 3
,所以 map(+3)
会先应用,然后(*3)
再应用,但反之亦然。我在这里缺少什么?
解决方案
fmap
必须遵守两条规律:
fmap id == id
fmap (f . g) == fmap f . fmap g
您提出的定义fmap' f g == g . f
满足第一定律但违反第二定律:
fmap' id f == f . id == f == id f -- OK
fmap' (f . g) h == h . (f . g)
== (h . f) . g
== (fmap' f h) . g
== fmap' g (fmap' f h)
== (fmap' g . fmap' f) h -- violation, since (.) is not commutative
正确的定义,fmap f g = f . h
,同时满足:
fmap id f == id . f == f == id f
fmap (f . g) h == (f . g) . h
== f . (g . h)
== fmap f (g . h)
== fmap f (fmap g h)
== (fmap f . fmap g) h
推荐阅读
- python-3.x - 如何知道何时使用 Python 将新视频上传到 youtube 频道
- python - 一种 Python 方法,用于计算单个行项目的滚动总和,然后使用它来执行进一步的计算
- prism - 如何根据所选视图和视图模型使用上下文项更新功能区?
- java - 使用 Java 反序列化 XML 并获取值
- javascript - 如何嵌套承诺?
- r - 从列表中制作一个矩阵,在 R 中具有某些重复的行和列
- python - 创建 SPS_HOME 环境变量时遇到问题
- apache-spark - 在现有 spark 数据集的开头添加一行
- algorithm - 展平高度图以满足步长要求
- angular - Angular拦截器:仅在第一个返回后才发送请求