gpt4 book ai didi

list - 用列表 monad 迭代

转载 作者:行者123 更新时间:2023-12-05 01:52:37 25 4
gpt4 key购买 nike

我无法理解如何从其 definition 派生列表 monad 的迭代行为.

instance Monad [] where
m >>= f = concatMap f m
return x = [x]
fail s = []

我读过的讨论似乎忽略了 >>= 如何创建控制结构的问题,正如 do 符号最清楚地显示的那样:

allEvenOdds :: Int -> [(Int,Int)]
allEvenOdds n = do
evenValue <- [2,4 .. n]
oddValue <- [1,3 .. n]
return (evenValue,oddValue)

这是 Haskell 内置的,我假设 IO monad 与实际 i/o 的接口(interface)是这样的吗?

最佳答案

没有任何内置的东西,一切都是您引用的 Monad 实例的简单结果(并且,由于此示例使用 do 表示法,因此如何使用 >>= 运算符):

allEvenOdds n = do
evenValue <- [2,4 .. n]
oddValue <- [1,3 .. n]
return (evenValue,oddValue)

-- desugaring the do notation
allEvenOdds n =
[2,4 .. n] >>= \evenValue ->
[1,3 .. n] >>= \oddValue ->
return (evenValue, oddValue)

-- using the list instance of Monad to replace >>= and return
allEvenOdds n =
concatMap (\evenValue ->
concatMap (\oddValue -> [(evenvalue, oddValue)]) [1,3 .. n]
) [2,4 .. n]

您可以很容易地看到它“遍历”了两个列表,并在所有对(偶数、奇数)的列表中产生了从两个列表中获取的值。

在高层次上,我们可以说列表 monad 导致迭代,因为 concatMapmap 一样,对列表的每个元素执行给定的函数,所以它隐式地遍历列表。

关于list - 用列表 monad 迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71540156/

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