【发布时间】:2018-11-16 08:55:21
【问题描述】:
在 Bartosz Milewski 的程序员类别理论中,Milewski 编写了以下代码来定义 Writer monad 的 return 和“鱼”运算符(Kleisli 类别中的组合)。
return :: a -> Writer a
return x = (x, "")
(>=>) :: (a -> Writer b) -> (b -> Writer c) -> (a -> Writer c)
m1 >=> m2 = \x ->
let (y, s1) = m1 x
(z, s2) = m2 y
in (z, s1 ++ s2)
然后他继续定义fmap如下:
fmap f = id >=> (\x -> return (f x))
我很难理解这里如何使用id 函数。 fish 运算符的第一个参数显然是 (a -> Writer b),但 id 具有类型签名 a -> a。
这是我理解的错误还是缺陷?将id 替换为return 对我来说更有意义。
【问题讨论】:
标签: haskell functional-programming monads functor