如何强制haskell中lambda项的求值为强正规形

如何强制haskell中lambda项的求值为强正规形,haskell,lambda,lazy-evaluation,Haskell,Lambda,Lazy Evaluation,我想知道是否可以在Haskell中关闭惰性评估 我想强制lambda项的求值为强正规形式 例如:我希望\x->(\y->y)x1减少到\x->x1 提前谢谢。你不能这么做。原因是Haskell不应该执行lambda项缩减。Haskell将程序(lambda术语)计算为值。一种可能的方法是真正执行lambda项缩减,但这将是非常低效的。因此,Haskell编译器使用了许多复杂的技术,例如图形简化。因此,在评估过程中,您无法观察到诸如(\x->x)y与y之间的差异-没有需要观察的实际lambda术语

我想知道是否可以在Haskell中关闭惰性评估
我想强制lambda项的求值为强正规形式

例如:我希望
\x->(\y->y)x1
减少到
\x->x1


提前谢谢。

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


请注意,GHC有一个类型类,它允许使用
rnf
-r-educe to n-ormal f-orm将术语评估为其正常形式(但正如@JakeMcArthur所指出的,它仍然不评估lambdas下的产品或副产品)。但是,这不允许您访问表示为lambda项的范式。它只告诉Haskell在计算过程中执行此计算。

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


请注意,GHC有一个类型类,它允许使用
rnf
-r-educe to n-ormal f-orm将术语评估为其正常形式(但正如@JakeMcArthur所指出的,它仍然不评估lambdas下的产品或副产品)。但是,这不允许您访问表示为lambda项的范式。它只告诉Haskell在计算过程中执行此评估。

超级编译器可能会解决此问题。目前,没有一个能很好地与当前ghc和当前包配合使用

存在一个较旧的超级编译器实现:

如果您对一些新的考虑因素感兴趣,这可能会引起您的兴趣:


然而,我也不能提出一个合适的解决方案。

这个问题可以由超级编译器来解决。目前,没有一个能很好地与当前ghc和当前包配合使用

存在一个较旧的超级编译器实现:

如果您对一些新的考虑因素感兴趣,这可能会引起您的兴趣:


但是,我也不能提出一个合适的解决方案。

请看这里:我想指出的是,第二句话使这个问题比被认为是重复的问题更加具体。这不是建议问题的重复。这是关于lambda下的评估。我所知道的任何Haskell实现都无法做到这一点。你想达到什么目的?我认为你不能在不将lambda应用于一般情况下的情况下强制使用lambda表达式。看这里:我想指出的是,第二句使这个问题比假设的问题更具体。这不是建议问题的重复。这是关于lambda下的评估。我所知道的任何Haskell实现都无法做到这一点。您试图实现什么?我认为在一般情况下,如果不应用lambda,就无法强制lambda表达式中的表达式。值得注意的是,
NFData
在lambdas下也不会减少。值得注意的是,
NFData
在lambdas下也不会减少。