我想测试列表/序列中的所有元素是否都等于
例如,整数序列。
我想测试序列中的ALL元素是否等于相同的数字。
到目前为止,我的解决方案看起来像是命令式编程解决方案。
let test seq =
if Seq.forall(fun num -> num =1) then 1
elif Seq.forall(fun num-> num = 2) then 2
else None
Run Code Online (Sandbox Code Playgroud)
您的解决方案很好!您不能使用模式匹配来很好地表达检查序列中的所有元素是否都有值的功能when,而必须使用子句,但这与代码完全一样(但语法更长)。在这种情况下,使用绝对没有问题if。
您可以通过定义自定义活动模式来扩展模式匹配,这在此处为您提供了一个不错的选择。这是相当高级的F#,但是您可以定义一个自定义模式ForAll n,当输入是仅包含n值的序列时,该模式将成功:
let (|ForAll|_|) n seq =
if Seq.forall (fun num -> num = n) seq then Some() else None
Run Code Online (Sandbox Code Playgroud)
请注意,成功表示为Some,失败表示为None。现在,您可以使用模式匹配很好地解决您的问题:
let test = function
| ForAll 1 -> Some 1
| ForAll 2 -> Some 2
| _ -> None
Run Code Online (Sandbox Code Playgroud)
这看起来很不错,但是它依赖于更高级的功能-如果您需要在多个地方进行此操作,则可以这样做。如果我只需要一个地方就可以,那么我会选择普通的if。