F#部分活动模式匹配“规则永远不会匹配”

时间:2013-07-21 21:30:39

标签: f# pattern-matching active-pattern

给出以下活动模式:

let (| HasMatch |) (x:string) = 
  if x.Contains("0") then Some()
  else None;;

以下模式匹配func:

let testFn x = function
  | HasMatch i -> printfn "%A" i
  | _ -> printf "nope";;

最后一行的通配符模式显示为warning FS0026: This rule will never be matched

我看到的所有示例似乎都推断出部分活动模式必须返回Some('a)才能匹配,返回None的模式会被通配符捕获。错误似乎有所不同。

我缺少什么?

1 个答案:

答案 0 :(得分:3)

我认为您应该将None案例添加到活动模式声明中,如下所示:

let (| HasMatch | _ |) (x:string) = 
  if x.Contains("0") then Some()
  else None;;

在您的原始示例中,编译器会推断您确实要返回Option类型。当您在示例中运行printf时,如果匹配,您会看到它打印Some Null

另外,返回Some()是不好的,你应该回复说Some(x)或类似的