嗨我已經開始學習F#,我在想你是否可以限制函數的輸入和輸出的類型。你可以在F#中給函數特定的類型簽名嗎?
我試着這樣做:
main : unit
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
let _ = main
,我也試圖把let
main
之前的第一道防線。都沒有工作。有沒有辦法在F#中做這種事情?我認爲這是Haskell的一個很好的功能。
嗨我已經開始學習F#,我在想你是否可以限制函數的輸入和輸出的類型。你可以在F#中給函數特定的類型簽名嗎?
我試着這樣做:
main : unit
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
let _ = main
,我也試圖把let
main
之前的第一道防線。都沒有工作。有沒有辦法在F#中做這種事情?我認爲這是Haskell的一個很好的功能。
是的,這是完全可能的:
let main : unit = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n")
此外,幾個小點:
首先,而非\n
在結束時,你可以使用printfn
。
其次,lambda表達式中的x
是多餘的,lambda表達式本身也是如此。測序多次調用,你可以簡單地按順序列出這些,每一個新的行(或用分號隔開):
let main : unit =
printfn "Hello World"
printfn "Goodbye World"
第三,這樣一來你沒有定義一個函數,而是一個值。與Haskell不同的是,F#並沒有被懶惰地評估過,所以這個定義的整個主體在其範圍開始的時候就會被執行一次,而不是每次調用它。如果你想定義一個函數,給它一些參數。如果你沒有任何有意義的參數給它,使它成爲一個單一unit
值:但是
let main() : unit =
printfn "Hello World"
printfn "Goodbye World"
輸入和輸出被限制它們隱含的約束,例如下面的代碼。
let add1int arg = number+1
let add1double arg = number+1.0
功能add1int
接受一個int並返回一個int。編譯器知道這是因爲arg的值被添加到另一個int。同樣,add1double
需要一倍,並返回一倍。
但是,如果你想顯式聲明你的輸入和輸出類型,而不是把它留給編譯器(這可以增加一些地方的可讀性)。
let add1int (number:int):int = number+1
let add1double (number:double):double = number+1.0
只是爲了澄清誰是不熟悉F#的語法OP的語法,每個參數的類型聲明需要括號周圍,並沒有括號的類型聲明(可以有一個最大的其中之一)的聲明的類型該函數的返回值。例如,'let f(x:int):string'聲明一個類型爲'int - > string'的函數,'let g(c:char)(n:int):string'聲明一個類型爲'char - > int - > string'。 – rmunn