当前位置:  开发笔记 > 小程序 > 正文

共享无点功能,但评估两次

如何解决《共享无点功能,但评估两次》经验,为你挑选了1个好方法。



1> leftaroundab..:

如预期的那样,foo仅评估一次(CSE可能会启动)

不,这与CSE无关,它只是惰性评估(又称按需调用)的工作方式:foo是一种恒定的应用形式,因此只需要一次计算(从thunk转换为WHNF),然后可以简单地进行计算无需进一步计算即可重复使用。之所以在GHCi-8中不再起作用,是因为7.8消除了GHCi中的单态性限制。为什么这是相关的?好吧,trace "eval foo" 5是type的多态表达式Num a -> a。多态表达式不能是CAF。因此,您不必按需呼叫,而可以按名称呼叫语义。

再次共享的最简单方法是通过使类型变为单态并添加显式签名来实施CAF:

Prelude Debug.Trace> let foo = trace "eval foo" 5 :: Int in foo + foo
eval foo
10


@andre_c您是错误的:`let foo = trace“ eval foo” x`不是多态绑定。它是单态的;foo必须具有调用方为x选择的确切类型。(注意,整个函数是多态的,但该子项不是!)例如,`let foo = trace“ eval foo” 5; y :: Int; y = foo; z ::双; z = foo`很好,因为`foo`是一个多态绑定;但是`let foo = trace“ eval foo” x; y :: Int; y = foo; z ::双; z = foo`是类型错误。
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有