我想知道是否可以在Haskell中关闭延迟评估;
我想强制将lambda术语的评估强制为强正常形式。
例如:我希望将\x -> (\y -> y) x 1
缩减为\x -> x 1
提前致谢。
答案 0 :(得分:1)
你不能这样做。原因是Haskell不应该执行lambda术语缩减。 Haskell 将程序(lambda术语)评估为值。如何做到这一点的一种可能性是真正执行lambda术语缩减,但这将是非常低效的。因此,Haskell编译器使用许多复杂的技术,例如图形缩减。因此,在评估过程中,您无法观察(\x -> x) y
与y
之间的差异 - 没有实际的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
但是,我无法提出适当的解决方案。