2017-10-12 66 views
2

嗨我已經開始學習F#,我在想你是否可以限制函數的輸入和輸出的類型。你可以在F#中給函數特定的類型簽名嗎?

我試着這樣做:

main : unit 
let main = printf "Hello World\n" |> (fun x -> printf "Goodbye World\n") 
let _ = main 

,我也試圖把letmain之前的第一道防線。都沒有工作。有沒有辦法在F#中做這種事情?我認爲這是Haskell的一個很好的功能。

回答

4

是的,這是完全可能的:

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" 
1

輸入和輸出被限制它們隱含的約束,例如下面的代碼。

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 
+2

只是爲了澄清誰是不熟悉F#的語法OP的語法,每個參數的類型聲明需要括號周圍,並沒有括號的類型聲明(可以有一個最大的其中之一)的聲明的類型該函數的返回值。例如,'let f(x:int):string'聲明一個類型爲'int - > string'的函數,'let g(c:char)(n:int):string'聲明一個類型爲'char - > int - > string'。 – rmunn

相關問題