【问题标题】:F# Order of Execution using CPS/Partial Application使用 CPS/部分应用程序的 F# 执行顺序
【发布时间】:2017-08-01 23:04:01
【问题描述】:

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

【问题讨论】:

  • 如果你想让 printZero 表现得像一个函数,你必须添加单位作为参数。让 printZero () = ...

标签: f# currying continuations


【解决方案1】:

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

let printZero = printfn "DIV/0"

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

你想要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

【讨论】:

    猜你喜欢
    • 2013-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多