【发布时间】:2015-09-07 02:22:49
【问题描述】:
我有一组要传递给其他 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 中,这类信息在编译时会被删除。您可能可以使用模板 haskell 来实现它,但这并不简单。
-
那里有大量资源可用于实现 lambda 演算。 TaPL 是一个特别好的例子,包括不同复杂程度的微积分的实现。似乎还有一些关于 Hackage 的小型实现可供您使用。
-
Haskell 是一种静态类型语言。它实际上并没有那么深入地涉及 lambda 演算,除非 lambdas 恰好是编写笛卡尔封闭范畴表达式的有用方法。但是直接使用类型来了解函数的作用要比查看一些等效的 lambda 表达式要高效得多。对于您想要实现的目标,像 Scheme 这样的语言会更合适。
-
this 有帮助吗?