【问题标题】:F# main vs main() syntax [duplicate]F# main vs main() 语法 [重复]
【发布时间】:2017-01-22 03:41:07
【问题描述】:

我只是想通过阅读 Wikibook 来学习一些 F#:https://en.wikibooks.org/wiki/F_Sharp_Programming/

考虑以下示例: https://en.wikibooks.org/wiki/F_Sharp_Programming/Mutable_Data

open System

let withSideEffects x =
    x := "assigned from withSideEffects function"

let refTest() =
    let msg = ref "hello"
    printfn "%s" !msg

    let setMsg() =
        msg := "world"

    setMsg()
    printfn "%s" !msg

    withSideEffects msg
    printfn "%s" !msg

let main() =
    refTest()
    Console.ReadKey(true) |> ignore

main()

我意识到他们把 () 放在每个有副作用的函数之后。删除大括号同样可以很好地编译并将类型从 unit -> unit 更改为 unit。

问题:

  1. 这是 F# 程序员之间的某种默契吗?
  2. 这两种语法中的一种有什么好处吗?

【问题讨论】:

标签: syntax f#


【解决方案1】:

() 添加到绑定中会将其从立即执行的块(其中返回值绑定到标识符(在本例中为unit)更改为接受unit 并返回unit 的函数(写成unit -> unit)。

这样做的好处是延迟执行,可以多次执行。这可能是抽象出副作用的有用方法,但它只是您可以在日常工具包中使用的语言的一个简单属性。你可能想多了。

【讨论】:

  • Ah :) 所以如果我有一个函数 getJSON = .. 它会立即执行,因此我的程序会在执行 main() 之前等待一小段时间?
  • 如果没有 () ,它就不会是一个接受unit 并返回一些东西的函数,它将是一个通过评估块分配的值。所以是的,在 main 执行之前会有延迟。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2013-11-04
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多