gpt4 book ai didi

haskell - 消除这个 Lua monad 模仿中的递归

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

我正在尝试粗略地复制 Parsec在 Lua 中,我在生成递归 runParser 时遇到了一些麻烦。

function Parser:bind(f)
return new(function(s)
local result = self.runParser(s)
if result.cons() == Result.Success then
return f(result.get()).runParser(result.get(2))
else
return result
end
end)
end

我正在使用自定义系统来制作 ADT,因此 cons()get() 函数返回值。等效的 Haskell 代码如下所示。

m >>= f = Parser $ \s -> case result of
Success a cs -> runParser (f a) cs
_ -> result
where
result = runParser m s

Parser 构造函数(Lua 中的new 函数)的参数是runParser 函数。因此,从 runParser 中非尾递归调用不同的 runParser 会生成非常深的调用堆栈,从而导致堆栈溢出。关于删除递归或将其转换为尾递归的任何提示?

最佳答案

Continuation passing 使这个问题很容易解决。

function Parser:bind(f)
return new(function(s, cont)
return self.runParser(s, function(result)
if result.cons() == Result.Success then
return f(result.get()).runParser(result.get(2), cont)
else
return cont(result)
end
end)
end)
end

这样一来,就是尾部调用了!诚然,f 有可能自行溢出,但这是用户编程错误的情况,因为 f 不应该深入到全部。

关于haskell - 消除这个 Lua monad 模仿中的递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31996183/

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