gpt4 book ai didi

haskell - 将 monad 用于诸如列表操作之类的琐碎任务?

转载 作者:行者123 更新时间:2023-12-03 15:05:51 25 4
gpt4 key购买 nike

每当我阅读 Monad 示例时,他们总是将 IO 作为案例研究。

有没有人可以提出的单子(monad)进行列表操作的例子?我认为这可能是矫枉过正,但如果 monad 能够比常规列表操作技术更具优势,我很感兴趣。

最佳答案

Haskell 中 list monad 的一大 secret 是列表推导是 do block 的语法糖。任何时候你写一个列表推导式,你都可以用一个 do block 来代替它,它使用 list monad 实例。

一个简单的例子

假设您要获取两个列表,并返回它们的笛卡尔积(即,(x,y) 的列表对于第一个列表中的 x 和第二个列表中的 y 的每个组合)。

您可以通过列表理解来做到这一点:

ghci> [(x,y) | x <- [1,2], y <- [3,4]] -- [(1,3),(1,4),(2,3),(2,4)]

列表理解是这个 do block 的语法糖:
zs = do x <- [1,2]
y <- [3,4]
return (x,y)

这反过来又是语法糖
zs = [1,2] >>= \x -> [3,4] >>= \y -> return (x,y)

一个更复杂的例子

但是,该示例并没有真正展示 monad 的强大功能,因为您可以轻松编写它,而无需依赖列表具有 Monad 实例的事实。例如,如果我们只使用 Applicative 实例:
ghci> import Control.Applicative
ghci> (,) <$> [1,2] <*> [3,4] -- [(1,3),(1,4),(2,3),(2,4)]

现在假设您获取正整数列表中的每个元素,并将其复制多次(例如 f [1,2,3] = [1,2,2,3,3,3])。谁知道你为什么要这样做,但这很容易:
ghci> let f xs = [ y | x <- xs, y <- replicate x x ]
ghci> f [1,2,3] -- [1,2,2,3,3,3]

这只是语法糖:
f xs = do x <- xs
y <- replicate x x
return y

这反过来又是语法糖
f xs = xs >>= \x -> replicate x x >>= \y -> return y

这次我们不能只使用应用程序实例来编写它。关键区别在于我们从第一个绑定(bind)( x)中获取输出,并使 block 的其余部分依赖它( y <- replicate x x)。

关于haskell - 将 monad 用于诸如列表操作之类的琐碎任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12706640/

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