我想加强一种模式以仅匹配通过附加验证功能的数字。
let (|IsValid|_|) n = ...
let (|Nil|One|Two|) (l : int list) =
match l with
| a :: b :: t -> Two(a + b)
| a :: t -> One(a)
| _ -> Nil
'One' 的情况很简单:
| IsValid(a) :: t -> One(a)
“二”的情况对我来说并不明显。它需要验证数字的总和。我可以在不使用 when-guard 的情况下做到这一点吗?
...
编辑:我可以像这样使用 when-guard(带有返回布尔值的 isValid 函数):
| a :: b :: t when isValid a + b -> Two(a + b)
这不如仅仅匹配一个模式那么优雅;更糟糕的是,a + b 被应用了两次。
另请注意,这是我的实际代码的简化版本(例如,我不是试图简单地匹配不同长度的列表) - 问题是关于双 cons 模式的嵌套匹配。