使用 CPS/Partial 应用程序的 F# 执行顺序
F# Order of Execution using CPS/Partial Application
为什么这里先打印 "DIV/0",然后打印“2”?
let printZero = printfn "DIV/0"
let printSuccess x = printfn "%d" x
let div ifZero success x y =
if y = 0
then ifZero
else x / y |> success
let printDiv = div printZero printSuccess
printDiv 8 4
printDiv 10 0
printfn "DIV/0"
将立即写入控制台,returning unit
。所以这一行:
let printZero = printfn "DIV/0"
...将立即写入 DIV/0
并将 unit
绑定到值 printZero
。稍后当您使用 y = 0
调用 div
函数时,您只是 return 该值。
你想要的是 printZero
是一个函数。由于该函数不需要任何值作为输入,因此您也可以在此处使用 unit
(表示为 ()
) - 因此您拥有类型为 unit -> unit
:
的函数
let printZero() = printfn "DIV/0"
let printSuccess x = printfn "%d" x
let div ifZero success x y =
if y = 0
then ifZero()
else x / y |> success
为什么这里先打印 "DIV/0",然后打印“2”?
let printZero = printfn "DIV/0"
let printSuccess x = printfn "%d" x
let div ifZero success x y =
if y = 0
then ifZero
else x / y |> success
let printDiv = div printZero printSuccess
printDiv 8 4
printDiv 10 0
printfn "DIV/0"
将立即写入控制台,returning unit
。所以这一行:
let printZero = printfn "DIV/0"
...将立即写入 DIV/0
并将 unit
绑定到值 printZero
。稍后当您使用 y = 0
调用 div
函数时,您只是 return 该值。
你想要的是 printZero
是一个函数。由于该函数不需要任何值作为输入,因此您也可以在此处使用 unit
(表示为 ()
) - 因此您拥有类型为 unit -> unit
:
let printZero() = printfn "DIV/0"
let printSuccess x = printfn "%d" x
let div ifZero success x y =
if y = 0
then ifZero()
else x / y |> success