【发布时间】:2015-12-09 12:52:16
【问题描述】:
liftMM :: Monad m => (a -> b) -> m a -> m b
liftMM f m = m >>= \a -> return (f a)
我跑:
> liftMM (*2) [1..10]
我得到了输出:
> [2,4,6,8,10,12,14,16,18,20]
我看不到这个函数是如何映射所有列表的值的?没有任何递归或迭代,只需将 monad 内部 m 值传递给函数 f。我在这里缺少什么?
【问题讨论】:
-
>>=对[]的定义就是concatMap——这个函数就是做映射的。 -
你已经使用单子定律定义了
fmap。 -
我不是第一次发现
>>=在这种情况下令人困惑。这里与 Monads 无关。 -
@ vikingsteve 我猜 list [] 是一个单子。这就是为列表定义 >>= 的原因。