2009-01-26 129 views
3

我是相當新的F#,我想兩個值的比較(匹配......與......)語法有兩個值F#匹配

當我嘗試兩個值進行比較類似問題出現這個:

let value1 = 19 
let isValue1 y = 
    match y with 
    | value1 -> y + 1 
    | _ -> y 

我得到一個警告,代碼中的「| _ - > y」部分永遠不會到達。爲什麼是這樣?

我知道我可以做以下來獲得功能工作,我希望它的方式:

let value1 = 19 
let isValue1 y = 
    match y with 
    | _ when y = value1 -> true 
    | _ -> false 

該作品,以及

let value1 = 19 
let isValue1 y = 
    match y with 
    | 19 -> true 
    | _ -> false 

我只是好奇,爲什麼我無法做到這一點,以及如何匹配實際工作。

回答

9

match語句中的value1被定義爲一個新變量,其值被設置爲y(作爲匹配)。您剛剛定義的值1將被忽略,就像您在C#函數中聲明局部變量的名稱與類變量一樣。出於這個原因,第一個匹配條件將匹配的所有內容,而不僅僅是先前定義的值1的值,因此是錯誤。希望澄清事項。

5

模式匹配既是一個控制結構(接下來執行什麼代碼)又是一個綁定結構(如'let',將一個名稱綁定到一個值)。所以當你做

match expr with 
| name -> ... 

模式(「名稱」)總是匹配,標識符'名稱'只是綁定到表達式的值。這就是爲什麼模式匹配主要與歧視聯盟(案例類型)一起使用,您根據結構進行匹配。例如。

match someOption with 
| Some(x) -> ... // binds x 
| None -> ... 

match someList with 
| h :: t -> ... // binds h and t to head/tail 
| [] -> ... 
1

你可以只匹配輸入由[<Literal>]屬性標明面值/標識符沒有約束力的。

例如:

#light 
[<Literal>] 
let E = 2.718281828459 


let isE x = 
    match x with 
    | E -> true 
    | _ -> false 

print_any (isE 3.2) 
print_any (isE E) 

根據Crish Smith