假设我有
f :: Int -> MyType
f i = ......
voxel :: MyType
voxel = f 2
function1 :: Double -> MyType -> MyOtherType
function1 x w = ......
function2 :: Double -> MyOtherType
function2 y = function1 y voxel
Run Code Online (Sandbox Code Playgroud)
现在,假设我调用function2两次,例如function2 1.0然后function2 2.0(我在上下文中OpenGL并且MyOtherType是要绘制的图形元素,用户可以y使用键盘进行更改).
那么,在第二次调用时function2,Haskell会重新评估voxel吗?
如果我有这样的情况,比方说是C语言,我会放一个printf在voxel知道答案,但我不能做这样的事情用纯Haskell的功能(可以吗?).
Dan*_*ner 12
Haskell没有说明会发生什么.
GHC不会重新评估voxel; 通常,let- 和where- 值最多只评估一次.(虽然请记住,类 - 多态值的行为类似于函数,选择实例的是函数应用程序,并且这些函数调用不会被记忆,因此显然良性的类 - 多态绑定可能会导致许多重新评估.)
您可以使用" printf" Debug.Trace.trace,但这仅用于教育和调试目的.
import Debug.Trace
voxel = trace "evaluated voxel" $ f 2
Run Code Online (Sandbox Code Playgroud)