2013-02-01 62 views
2

我剛剛開始使用F#和函數式編程。我想知道我怎麼可以做一個函數採取一個元組,我定義第一個值必須是一個字符串,而不是標準的int。如何在函數中定義元組中的類型

實施例:

能夠複製一個字符串,sn倍,並返回它的函數。我現在所擁有的是這樣的:

let rec pow2 = function 
    | (s:string,0) -> "" 
    | (s:string,n) -> s + pow2(s,n-1) 

這工作,但我認爲沒有比定義s:string任何情況下更好的辦法。

(我知道String.replicate,這是不適合的效果着想,而是學習)

回答

7

事實上,沒有類型標註在這裏需要。在第一個模式匹配的""返回值是編譯器足夠足夠提示:

> let rec pow2 = function 
    | (s,0) -> "" 
    | (s,n) -> s + pow2(s,n-1);; 

val pow2 : string * int -> string 
4

您只需要在第一個案件類型註釋 - F#編譯器可以推斷,元組的第一個元素在其他案例中必須是string

let rec pow2 = function 
    | (s:string,0) -> "" 
    | (s,n) -> s + pow2(s,n-1) 

這只是一個風格問題,但我認爲這是一個更容易一些,如果你寫這樣的功能爲:

let rec pow2 (s, n) = 
    match n with 
    | 0 -> "" 
    | _ -> s + pow2(s, n-1) 
4

你也可以像這樣做,其中的類型元組在函數定義給出:

let rec pow2 ((s, n) : string * int) = 
    match n with 
    | 0 -> "" 
    | _ -> s + pow2 (s, n - 1) 

注意,元組的元素由*在顯式類型的註釋分隔。另外,正如Stephen指出的那樣,在這個例子中,類型推斷系統將足夠聰明,可以計算出元組的類型,因爲我們將n與一個整數匹配,因爲我們將一個字符串("")添加到s

相關問題