函数liftM和mapM有什么区别?

最佳答案

首先,类型不同:

liftM :: (Monad m) => (a -> b) -> m a -> m b
mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
liftMa -> b类型的功能提升为单子(monad)形式。mapM将产生单值形式的函数应用于值列表,从而生成嵌入在monad中的结果列表。

例子:
> liftM (map toUpper) getLine
Hallo
"HALLO"

> :t mapM return "monad"
mapM return "monad" :: (Monad m) => m [Char]

...请注意mapmapM不同!例如。
> map (x -> [x+1]) [1,2,3]
[[2],[3],[4]]
> mapM (x -> [x+1]) [1,2,3]
[[2,3,4]]

10-08 12:46