gpt4 book ai didi

debugging - Haskell 调试任意 lambda 表达式

转载 作者:行者123 更新时间:2023-12-04 15:32:58 26 4
gpt4 key购买 nike

我有一组要传递给其他 lambda 的 lambda 表达式。所有 lambda 只依赖于它们的参数,它们不调用任何外部函数。当然,有时它会变得相当困惑,我会将参数数量不正确的函数传递给另一个函数,从而创建 GHCi 异常。

我想制作一个调试函数,它将采用任意 lambda 表达式(具有未知数量的参数)并根据 lambda 的结构和函数返回一个字符串。

例如,假设我有以下 lambda 表达式:

i = \x -> x
k = \x y -> x
s = \x y z -> x z (y z)
debug (s k)应该返回 "\a b -> b" debug (s s k)应该返回 "\a b -> a b a" (如果我正确地简化了)
debug s应该返回 "\a b c -> a c (b c)"
这样做的好方法是什么?

最佳答案

我认为这样做的方法是在 Haskell 中定义一个小的 lambda 演算 DSL(或使用现有的实现)。这样,您可以编写类似的东西,而不是使用 native Haskell 公式

k = Lam "x" (Lam "y" (App (Var "x") (Var "y")))
s = Lam "x" (Lam "y" (Lam "z" (App (App (Var "x") (Var "z")
(App (Var "y") (Var "z"))))
s 也是如此和 i .然后,您将编写/使用评估函数,以便您可以编写
debug e = eval e
debug (App s k)

这将以您自己的语法为您提供最终形式。此外,您需要一种解释器来将您的 DSL 语法转换为 Haskell,以便您可以实际使用代码中的函数。

实现这一点看起来确实有很多(棘手的)工作,而且它可能并不完全符合您的想法(特别是如果您需要对类型化语法进行评估),但我相信这将是一次很棒的学习体验。一个很好的引用是 chapter 6 of "Write you a Haskell" .使用现有的实现会容易得多(但不那么有趣:))。

如果这只是出于调试目的,您可能会受益于查看 ghc 编译到的核心语法。见 chapter 25 of Real world Haskell ,要使用的 ghc 标志是 -ddump-simpl。但这意味着查看生成的代码,而不是在程序中生成表示。我也不确定您能够在多大程度上轻松识别核心代码中的特定功能(我没有这方面的经验,所以 YMMV)。

如果在函数上使用 show 会给出您描述的那种输出,那当然会很酷,但可能有很好的理由函数不是 Show 的实例(我无法告诉您)。

关于debugging - Haskell 调试任意 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32430304/

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