我想知道是否可以在 Haskell 中关闭惰性求值;
我想强制将 lambda 项评估为强范式。
例如:我想\x -> (\y -> y) x 1
减少到\x -> x 1
提前致谢。
我想知道是否可以在 Haskell 中关闭惰性求值;
我想强制将 lambda 项评估为强范式。
例如:我想\x -> (\y -> y) x 1
减少到\x -> x 1
提前致谢。
你不能这样做。原因是 Haskell 不应该执行 lambda 项减少。Haskell将程序(lambda 项)评估为值。如何做到这一点的一种可能性是真正执行 lambda 项减少,但这将是非常低效的。因此 Haskell 编译器使用了许多复杂的技术,例如图形缩减。因此,在评估过程中您无法观察到差异,例如(\x -> x) y
vs y
- 没有实际的 lambda 项需要观察。
请注意,GHC 具有类型类,它允许使用-r -educe 到n -ormal fNFData
-orm将术语评估为其正常形式rnf
(但只有产品或副产品,它仍然不评估 lambdas 下的术语,正如@JakeMcArthur 指出的那样) . 但是,这并不能让您访问以 lambda 项表示的正常形式。它只告诉 Haskell 在计算期间执行此评估。
超级编译器可以解决这个问题。现在,没有一个与当前的 ghc 和当前的软件包真正配合得很好。
存在一个旧的超级编译器实现:http: //community.haskell.org/~ndm/supero/
我对一些新的考虑感兴趣,这可能很有趣: http: //pure.ltu.se/portal/files/2231262/nwpt08-scp.pdf
但是,我也不能提出适当的解决方案。