Haskell在根据此值调用函数时是否重新计算值?

Sté*_*ent 4 haskell

假设我有

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语言,我会放一个printfvoxel知道答案,但我不能做这样的事情用纯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)

  • @StéphaneLaurent"类多态绑定"表示类型具有类约束的值.例如`x :: Num a => a; x = 0`是类多态的,可以在每次使用时重新评估,而`id :: a - > a; id x = x`是多态的,但不是class-polymorphic和`x2 :: Int; x2 = 0`是单态的. (2认同)