在f#中的string的开始模式匹配

我想在f#中匹配string的开头。 不知道是否我必须把它们当作一个字符列表或什么。 任何build议,将不胜感激。

这是我正在尝试做的一个伪代码版本

let text = "The brown fox.." match text with | "The"::_ -> true | "If"::_ -> true | _ -> false 

所以,我想看看string和匹配的开始。 注意我没有匹配的string列表只是写上述作为我想要做的本质的想法。

参数化的活动模式来拯救!

 let (|Prefix|_|) (p:string) (s:string) = if s.StartsWith(p) then Some(s.Substring(p.Length)) else None match "Hello world" with | Prefix "The" rest -> printfn "Started with 'The', rest is %s" rest | Prefix "Hello" rest -> printfn "Started with 'Hello', rest is %s" rest | _ -> printfn "neither" 

是的,如果你想使用匹配expression式,你必须把它们当成一个字符列表。

简单地转换string:

 let text = "The brown fox.." |> Seq.toList 

然后你可以使用匹配expression式,但是你必须为每个字母使用字符(列表中的元素的types):

 match text with | 'T'::'h'::'e'::_ -> true | 'I'::'f'::_ -> true | _ -> false 

正如布赖恩build议参数化主动模式更好,这里有一些有用的模式(走到页面的末尾)。

你也可以在模式上使用警卫:

 match text with | txt when txt.StartsWith("The") -> true | txt when txt.StartsWith("If") -> true | _ -> false