2014-03-13 94 views
8

我是新來的F#,也沒有在任何地方看到了如何執行以下操作正確模式匹配多個變量

let fun1 a b = 
match a b with 
| a + b > 0 -> fun2 
| a + b < 0 -> fun3 

我有一個模式來做到這一點的匹配,家庭作業,但是我不知道如何正確地做到這一點。我認爲我可以使用元組如下:

let fun1 (a,b) = 
match (a,b) with 
| (a,b) when a + b > 0 -> fun2 
| (a,b) when a + b < 0 -> fun3 

但這並不起作用。我如何繼續?

回答

11

你有正確的想法,你只是忘記了F#中的縮進問題。添加空間讓你的解決方案的工作:

let fun1 (a,b) = 
    match (a,b) with 
    | (a,b) when a + b > 0 -> fun2 
    | (a,b) when a + b < 0 -> fun3 

這其實模式匹配了兩次,所以我們可能要重寫一遍:

let fun1 t = function 
    | (a,b) when a + b > 0 -> fun2 
    | (a,b) when a + b < 0 -> fun3 

編譯器/解釋器將讓這個經歷,但有一個警告:

警告FS0025:不完整的模式匹配此表達式。

我會留下除暴安良,作爲一個鍛鍊:-)

PS。很好的你是這個家庭作業的前期。

+0

這是一個愚蠢的錯誤!非常感謝! –

+0

最受歡迎。一定要看看kvs的答案,下面有我沒有提到的好點。 –

9

SørenDebois是正確的。這裏有一些其他注意事項:

  1. ab已經在範圍內,所以你不需要去匹配,可以匹配任何反對:

    let fun1 (a,b) = 
        match() with 
        |() when a + b > 0 -> fun2 
        |() when a + b < 0 -> fun3 
    
  2. 出於這個原因,使用if語句可能更習慣。

  3. 你明顯錯過了這個案例a + b = 0;請注意,編譯器總是假設when子句可能不包含任何內容,因此即使添加|() when a + b = 0 -> ...大小寫,您仍然會得到一些警告:某些情況可能未被處理。您只需要執行|() -> ...| _ -> ...

  4. 這裏有一個let f <pattern> = match <same pattern> with |...表格的定義的內置快捷方式,它是let f = function |...。你會使用它像:

    let fun1 = function 
    | (a,b) when a + b > 0 -> fun2 
    | ... 
    

    注意,現在ab不是由函數定義約束,所以從我的第一個音符不適用的想法,你必須向他們介紹的格局。

+0

謝謝,這可以幫助我使我的代碼更好看! –

2

您可以在比賽條款中添加:

let fun2() =() 
let fun3() =() 
let fun1 a b = 
    match (a+b) with 
     | res when res > 0 -> fun2 
     | res when res < 0 -> fun3 
     | _ -> raise (new System.NotImplementedException()) 

護住模式的所有情況下,良好的實踐:-)

+1

好的調用匹配而不是元組。 – mydogisbox