F#使用CPS /部分应用程序的执行顺序

Run*_*ine 2 continuations f# currying

为什么这会先打印"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
Run Code Online (Sandbox Code Playgroud)

Cha*_*ger 5

printfn "DIV/0"将立即写入控制台,返回unit.所以这一行:

let printZero = printfn "DIV/0"
Run Code Online (Sandbox Code Playgroud)

...将立即写入DIV/0并绑定unit该值printZero.稍后当您使用div函数调用时y = 0,您只需返回该值.

你想要的是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
Run Code Online (Sandbox Code Playgroud)