函数liftM和mapM有什么区别?
最佳答案
首先,类型不同:
liftM :: (Monad m) => (a -> b) -> m a -> m b
mapM :: (Monad m) => (a -> m b) -> [a] -> m [b]
liftM
将a -> b
类型的功能提升为单子(monad)形式。mapM
将产生单值形式的函数应用于值列表,从而生成嵌入在monad中的结果列表。例子:
> liftM (map toUpper) getLine
Hallo
"HALLO"
> :t mapM return "monad"
mapM return "monad" :: (Monad m) => m [Char]
...请注意
map
和mapM
不同!例如。> map (x -> [x+1]) [1,2,3]
[[2],[3],[4]]
> mapM (x -> [x+1]) [1,2,3]
[[2,3,4]]