JOIN
我跑:
liftMM :: Monad m => (a -> b) -> m a -> m b
liftMM f m = m >>= \a -> return (f a)
我得到了输出:
> liftMM (*2) [1..10]
我无法看到此函数如何映射所有列表的值?没有任何递归或迭代,只有一个monad内部m值传递给函数f。我在这里缺少什么?
答案 0 :(得分:2)
m
此处[]
和liftMM
的工作方式是委托(>>=)
和return
m
的实施。因此,您需要了解(>>=)
和return
列表,如果您查看它们是definition:
instance Monad [] where
xs >>= f = [y | x <- xs, y <- f x]
return x = [x]
因此,源列表>>=
中的每个元素都应用f
,然后将返回列表的每个元素插入到结果列表中。
return x
只返回包含x
的单例列表,因此return (f a)
会返回列表[f a]
。然后,每个单个元素列表由(>>=)
组合以创建输出列表。
答案 1 :(得分:0)
列表是liftMM :: Monad m => (a -> b) -> m a -> m b
,因此给出了地图的签名:
[]
和liftMM的签名
m
liftMM
是map
这意味着列表的 ScannedRobotEvent
和Scan()
执行相同的操作。