当谈到 F# 的许多领域时,我仍然是新手。我问这个问题更多是出于好奇,而不是出于实际的业务需求。有什么方法可以匹配列表中的前n 个项目,而不管它们出现的顺序是什么?为了澄清,请考虑以下示例:
type MyEnum =
| Foo of int
| Bar of float
| Baz of string
let list = [ Foo 1 ; Bar 1.0 ; Baz "1" ]
some_func
现在,假设如果列表中的前两项是 aFoo
和 a ,我想以Bar
任意顺序调用。匹配两种可能的排列相当容易:
let result =
match list with
| Foo n :: Bar x :: _
| Bar x :: Foo n :: _ -> some_func n x
| _ -> failwith "First 2 items must be Foo and Bar"
但是,如果前 3 项是 a并且以任何顺序调用函数Foo
,我该怎么办?使用上述相同的技术将需要我编写所有 6 种不同的排列(或n!对于n 个项目)。理想情况下,我希望能够按照以下方式做一些事情:Bar
Baz
let result =
match list with
| (AnyOrder [ Foo n ; Bar x ; Baz s ]) :: _ -> some_func n x s
| _ -> failwith "First 3 items must be Foo, Bar, and Baz"
有没有办法通过某种活动模式来实现这一点,而不必对不同的排列进行硬编码?