我正在通过使用活动模式编写递归下降解析器来学习 F#。
由于我的所有规则或部分活动模式我需要以不同的方式组合它们,但我对将活动模式作为参数传递的语法感到非常沮丧。
以下示例显示了我遇到的麻烦:
// Combines two patterns by chaining them.
let (|Chain|_|) (|Pattern1|_|) (* Should I use pipes here? *) (|Pattern2|_|) data =
match data with
|Pattern1 result ->
match result with
|Pattern2 result2 -> Some result2
|_ -> None
|_ -> None
// Stupid test patterns
let (|IfBiggerThan10ThenDouble|_|) value = if value > 10 then Some (value*2) else None
let (|IfLessThan100ThenDouble|_ |) value = if value < 100 then Some (value*2) else None
match 20 with
// Do I need pipes here?
|Chain (IfBiggerThan10ThenDouble IfLessThan100ThenDouble) value -> printfn "%A" value // Should print 80
| _ -> printfn "Did not match"
我的主要困惑似乎是关于“|” 操作员。有时它似乎是模式类型的一部分,有时是名称的一部分。