2017-01-22 71 views
0

我只是試圖去通過維基教科書,學習一些F#:https://en.wikibooks.org/wiki/F_Sharp_Programming/F#主VS main()的語法

考慮從下面的例子: 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() 

我意識到,他們把( )在每個有副作用的功能之後。去除大括號編譯平衡良好,並將類型從單位 - >單位更改爲單位。

問題:

  1. 這是某種形式的F#程序員之間的沉默aggrement的?
  2. 2種語法之一有沒有好處?
+1

另請參見:爲什麼F#函數在被調用之前評估?(https://stackoverflow.com/questions/32855383/why-do-f-functions-evaluate-before-they-arecall) – ildjarn

回答

1

添加()從一個立即執行塊的結合的改變它,其中,所述返回值被綁定到標識符(unit在這種情況下),給接受unit並返回unit(寫爲unit -> unit)的函數。

這樣做的優點是執行延遲並且可以執行多次。這可能是提取副作用的有用方法,但它只是您可以在日常工具包中使用的語言的簡單屬性。你可能正在推翻它。

+0

Ah: )所以,如果我有一個函數getJSON = ..它會馬上執行,因此我的程序會在執行main()之前等待一小段時間? – Xlaech

+0

如果沒有()它不是一個採用「單元」並返回一些東西的函數,它將是一個通過評估塊來分配的值。所以是的,在主執行之前會有延遲。 – marklam