我有一组lambda表达式,我将其传递给其他lambda表达式。所有的lambda只依赖于他们的论点,他们不会调用任何外部函数。当然,有时候它会让人感到困惑,我会通过不正确的参数数量传递给另一个参数,从而创建一个GHCi异常。Haskell调试任意的lambda表达式
我想制作一个调试函数,它将采用任意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)"
Wha吨会是这样做的好方法?
不是真的在Haskell中,这种信息在编译时被擦除。你可以使用模板haskell来实现它,但这并不简单。 – bheklilr
在那里实现lambda演算有很多资源。 [TaPL](http://www.cis.upenn.edu/~bcpierce/tapl/)是一个特别好的项目,并且包括各种复杂程度的结石的实现。在Hackage上似乎也有一些小的实现,你可以使用它。 –
Haskell是一种静态类型语言。其实并不是深度涉及lambda微积分,除非lambda恰好是写笛卡尔封闭类别表达式的有用方式。但直接使用类型来了解函数的作用,而不是查看一些等效的lambda表达式会更有效率。对于你想要达到的目标,像Scheme这样的语言会更合适。 – leftaroundabout