如何强制评估haskell中的lambda项为强正规形式

时间:2013-07-10 10:29:02

标签: haskell lambda lazy-evaluation

我想知道是否可以在Haskell中关闭延迟评估;
我想强制将lambda术语的评估强制为强正常形式。

例如:我希望将\x -> (\y -> y) x 1缩减为\x -> x 1

提前致谢。

2 个答案:

答案 0 :(得分:1)

你不能这样做。原因是Haskell不应该执行lambda术语缩减。 Haskell 程序(lambda术语)评估为值。如何做到这一点的一种可能性是真正执行lambda术语缩减,但这将是非常低效的。因此,Haskell编译器使用许多复杂的技术,例如图形缩减。因此,在评估过程中,您无法观察(\x -> x) yy之间的差异 - 没有实际的lambda术语可供观察。

请注意,GHC具有NFData类型类,可以使用rnf - r -educe到 n 来评估其正常形式的术语 - ormal f -orm(但只有产品或副产品,它仍然没有评估lambdas下的条款,正如@JakeMcArthur指出的那样)。但是,这并不能让您访问表示为lambda术语的正常形式。它只告诉Haskell在计算过程中执行此评估。

答案 1 :(得分:0)

超级编译器可以解决这个问题。现在,没有一个能够与当前的ghc和当前包一起使用。

存在一个超级编译器的旧实现: http://community.haskell.org/~ndm/supero/

我对一些新的考虑感兴趣,这可能是有意义的: http://pure.ltu.se/portal/files/2231262/nwpt08-scp.pdf

但是,我无法提出适当的解决方案。