使用 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