何时评估F#函数调用; 懒惰还是马上?

Ben*_*boy 16 f# currying lazy-evaluation

F#中的Curried函数.我得到了一个位,传入一个参数子集产生一个带预设的函数.我只是想知道传递所有参数是否有任何不同.例如:

let addTwo x y = x + y
let incr a = addTwo 1
let added = addTwo 2 2
Run Code Online (Sandbox Code Playgroud)

incr是一个带有一个论点的函数.是addedint还是函数?我可以想象一个实现,其中"添加"仅在使用时被懒惰地评估(就像Schroedinger的Cat打开盒子一样).是否有保证何时进行添加?

Tea*_*Dev 18

added不是一个功能; 它只是一个计算出来并在现场绑定到名称的值.一个函数总是至少需要一个参数; 如果没有什么有用的东西可以传递,那就是unit价值():

let added () = addTwo 2 2
Run Code Online (Sandbox Code Playgroud)


Ree*_*sey 12

incr是一个带有一个参数的函数.是添加了一个int还是一个函数?

added在这种情况下,是一个命名绑定,其值为int.它不是一个功能.

我可以想象一个实现,其中"添加"仅在使用时被懒惰地评估(就像Schroedinger的Cat打开盒子一样).是否有保证何时进行添加?

加入将执行立即产生的结合时.没有懒惰.

正如TeaDrivenDev解释的那样,您可以added通过添加参数将其更改为绑定函数而不是绑定值,该参数可以是unit:

let added () = addTwo 2 2
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它将是一个函数,因此在您调用它之前不会发生添加:

let result = added () // Call the function, bind output to result
Run Code Online (Sandbox Code Playgroud)


Mar*_*ann 12

F#是一种急切评估的语言,因此表达式addTwo 2 2将立即被评估为该int类型的值.

相比之下,哈斯克尔被懒惰地评估了.在addTwo 2 2需要值之前,不会计算表达式.但是,表达式的类型仍然是一个整数.即便如此,这种表达尽管有懒惰,却不被视为一种功能; 在Haskell中,这种未经评估的表达式称为thunk.这基本上只意味着'一个尚未评估的任意复杂表达'.