gpt4 book ai didi

haskell - Cont Monad 打破 Haskell 的懒惰

转载 作者:行者123 更新时间:2023-12-04 03:04:12 31 4
gpt4 key购买 nike

我正在尝试 Cont monad,并发现了以下问题。

  • 首先构造一个无限列表并将所有元素提升到 Cont monad
  • 使用序列操作在无限列表上获取 Cont monad。
  • 例如,当我们尝试使用 head 运行 monad 时,它会陷入无限循环
    在尝试扩展延续时,头部永远不会被调用。

  • 代码如下所示:
    let inff = map (return :: a -> Cont r a) [0..]
    let seqf = sequence inff
    runCont seqf head

    那么这是对 Haskell 中 Cont monad 实现的限制吗?
    如果是这样,我们如何改进这一点?

    最佳答案

    原因是即使 sequence someList 的 head 元素的值仅取决于 someList 的第一个元素,效果sequence someList一般可以依赖 someList 的所有效果(它适用于大多数单子(monad))。因此,如果我们要评估头部元素,我们仍然需要评估所有的效果。

    例如,如果我们有一个列表 Maybe值,sequence someList 的结果是 Just仅当 someList 的所有元素是 Just .所以如果我们尝试 sequence一个无限列表,如果它们都是 Just,我们需要检查它的无限数量的元素.

    这同样适用于 Cont .
    在 continuation monad 中,我们可以随时从计算中逃脱,并返回与迄今为止计算的结果不同的结果。
    考虑以下示例:

    test :: (Num a, Enum a) => a
    test = flip runCont head $
    callCC $ \esc -> do
    sequence (map return [0..100] ++ [esc [-1]])

    或直接使用 cont而不是 callCC :
    test' :: (Num a, Enum a) => a
    test' = flip runCont head $
    sequence (map return [0..100] ++ [cont (const (-1))])
    test 的结果只是 -1 .在处理完前 100 个元素后,最后一个元素可以决定转义所有这些并返回 -1反而。所以为了看看 head是什么 sequence someList 的元素在 Cont ,我们再次需要计算它们。

    关于haskell - Cont Monad 打破 Haskell 的懒惰,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21948905/

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