2011-03-17 36 views
0

如何編寫一個匹配函數,它需要兩個字符串並將它們相互比較?現在我只是有這個。第一個不起作用。有沒有更好的辦法?如何使用函數參數作爲F#中的模式匹配的文字?

let matchFn ([<Literal>]matchString) (aString : string) = match aString with 
                  matchString -> true 
                  | _ -> false 

let matchFn (matchString : string) (aString : string) = match aString with 
                  _ when (matchString = aString) -> true 
                  | _ -> false 

回答

4

在這種特定的情況下,你當然可以只寫aString = matchString,但我想你問的是一般情況。文字只允許在模塊級別上使用,並且它們的右側必須有一個簡單的常量表達式(source)。

但是,您可以對這種情況使用活動模式。例如(從here):

let (|Equals|_|) expected actual = 
    if actual = expected then Some() else None 

,然後用它是這樣的:

let matchFn (matchString : string) (aString : string) = 
    match aString with 
    | Equals matchString -> true 
    | _ -> false 
1

您可以使用把守的比賽:

let matchFn matchString (aString : string) = match aString with 
               x when x = matchString -> true 
               | _ -> false 

或者更地道:

let matchFn (matchString:string) = function 
    | x when x = matchString -> true 
    | _ -> false