gpt4 book ai didi

haskell - Haskell中的liftM和mapM有什么区别

转载 作者:行者123 更新时间:2023-12-03 14:27:41 26 4
gpt4 key购买 nike

函数 liftM 和 mapM 有什么区别?

最佳答案

他们并没有真正的关系。我将尝试解释他们每个人的作用。我假设你对什么是 monad 有一个基本的了解。
liftM :: Monad m => (a -> b) -> (m a -> m b)允许您在 monad 中使用普通函数。它需要一个函数a -> b , 并将其转换为函数 m a -> m b ,这与原始函数的作用完全相同,但它是在 monad 中完成的。结果函数对 monad 没有“做”任何事情(它不能,因为原始函数不知道它在 monad 中)。例如:

main :: IO ()
main = do
output <- liftM ("Hello, " ++) getLine
putStrLn output

函数 ("Hello, " ++) :: String -> String将“Hello,”添加到字符串中。将其传递给 liftM创建 IO String -> IO String 类型的函数-- 现在你有了一个在 IO monad 中工作的函数。它不做任何 IO,但它可以将一个 IO Action 作为输入,并产生一个 IO Action 作为输出。因此,我可以通过 getLine作为输入,它将调用 getLine , 在结果前面添加“Hello”,并将其作为 IO 操作返回。
mapM :: Monad m => (a -> m b) -> [a] -> m [b]完全不同;请注意,与 liftM 不同,它需要一个单子(monad)函数。例如,在 IO monad 中,它的类型为 (a -> IO b) -> [a] -> IO [b]。 .很像普通的 map函数,只有它将一个单子(monad) Action 应用于列表,并产生一个包含在单子(monad) Action 中的结果列表。例如(一个非常糟糕的):
main2 :: IO ()
main2 = do
output <- mapM (putStrLn . show) [1, 2, 3]
putStrLn (show output)

这打印:
1
2
3
[(),(),()]

它正在做的是迭代列表,应用 (putStrLn . show)到列表中的每个元素(具有打印出每个数字的 IO 效果),并将数字转换为 ()值(value)。结果列表由 [(), (), ()] 组成-- putStrLn 的输出.

关于haskell - Haskell中的liftM和mapM有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5856709/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com