如何在F#中使用函数参数作为模式匹配的文字?

时间:2011-03-17 23:29:24

标签: 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

2 个答案:

答案 0 :(得分: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 :(得分: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