gpt4 book ai didi

Haskell,forM - 为什么这段代码返回这样的结果?

转载 作者:行者123 更新时间:2023-12-02 14:07:23 26 4
gpt4 key购买 nike

我看到的时候很惊讶:

forM [5,6] (\x -> x:[7])
[[5,6],[5,7],[7,6],[7,7]]

我想得到 [[5,7], [6,7]]。我知道可以使用 map 来获取它,但我现在正在学习 monad。
我进行下一步,并尝试:

forM [5,6] (\x -> print x)
5
6
[(),()]

这是什么意思? [(), ()] 至少很奇怪。你能解释一下这个问题吗?

最佳答案

关于你奇怪的[(),()]

对于第二个,请记住:printShow a => a -> IO ()(并且具有使用show打印出值的副作用)

现在

forM [5,6] print -- same as yours
= mapM print [5,6]
= sequence $ fmap print [5,6]
= sequence [print 5, print 6]

现在来说一下副作用:IO monad 中的sequence 只会依次计算一个

但对于结果来说,它是[(),()](记住:sqeuence::[IO a] -> IO [a])

所以你首先得到副作用(56 打印在换行符上),然后是计算结果[(),()]

摆脱它:

您可以通过使用 forM_ 来摆脱这个问题(这将返回 ()):

> import Control.Monad(forM_)
> forM_ [5,6] print
5
6

关于列表单子(monad)

你可以从这里看出为什么第一个:

forM [5,6] (\x -> x:[7])
= mapM (\x -> x:[7]) [5,6]
= sequence (fmap (\...) [5,6])
= sequence [[5,7],[6,7]]
= [[5,6],[5,7],[7,6],[7,7]]

记住 - list-monad 基本上是在那里做叉积

关于Haskell,forM - 为什么这段代码返回这样的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36383645/

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