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

时间:2017-03-11 17:04:44

标签: f# currying continuations

为什么首先打印“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

1 个答案:

答案 0 :(得分:5)

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

let printZero = printfn "DIV/0"

...将立即写入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