gpt4 book ai didi

haskell - 将 Scheme call/cc 翻译成 Haskell callCC

转载 作者:行者123 更新时间:2023-12-04 14:44:19 30 4
gpt4 key购买 nike

让我们考虑突破一个非终止的折叠:

(call/cc (lambda (folded)
(stream-fold
(lambda (acc v)
(if (< v 5)
(cons v acc)
(folded acc)))
'()
(in-naturals 0))))
; returns '(4 3 2 1 0)

上述代码的 Haskell 等效项是

callCC $ \folded -> foldl (\acc v -> if v < 5 then v:acc else folded acc) [] [0..]

此代码无法编译并提示无法在表达式 folded acc 中构造无限类型。我已经知道如何在 Y 组合器等情况下消除这种错误,但同样的方法似乎在这里不起作用。这种情况的正确方法是什么?

最佳答案

是的;作为 j。亚伯拉罕森说,

import Control.Monad.Trans.Cont
import Control.Monad

bar :: Cont r [Int]
bar = callCC $ \folded ->
foldM (\acc v -> do
when (v >= 5) $ folded acc
return $ v : acc) [] [0..]

thing = runCont bar id

作品。

关于haskell - 将 Scheme call/cc 翻译成 Haskell callCC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446393/

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