gpt4 book ai didi

f# - 如何匹配一个值的多个副本?

转载 作者:行者123 更新时间:2023-12-04 00:47:33 25 4
gpt4 key购买 nike

F# 的模式匹配非常强大,所以写起来很自然:

match (tuple1, tuple2) with
| ((a, a), (a, a)) -> "all values are the same"
| ((a, b), (a, b)) -> "tuples are the same"
| ((a, b), (a, c)) -> "first values are the same"
// etc

但是,第一个模式匹配会出现编译器错误:
'a' is bound twice in this pattern

有没有比以下更清洁的方法呢?
match (tuple1, tuple2) with
| ((a, b), (c, d)) when a = b && b = c && c = d -> "all values are the same"
| ((a, b), (c, d)) when a = c && b = d -> "tuples are the same"
| ((a, b), (c, d)) when a = c -> "first values are the same"
// etc

最佳答案

这是 F# 的“事件模式”的完美用例。您可以像这样定义其中的几个:

let (|Same|_|) (a, b) =
if a = b then Some a else None

let (|FstEqual|_|) ((a, _), (c, _)) =
if a = c then Some a else None

然后清理与它们匹配的模式;注意第一种情况(所有值都相等)如何使用嵌套的 Same用于检查元组的第一个和第二个元素是否相等的模式:
match tuple1, tuple2 with
| Same (Same x) ->
"all values are the same"
| Same (x, y) ->
"tuples are the same"
| FstEqual a ->
"first values are the same"
| _ ->
failwith "TODO"

性能提示:我喜欢用 inline 标记这些简单的事件模式-- 因为事件模式中的逻辑很简单(只有几个 IL 指令),所以内联它们并避免函数调用的开销是有意义的。

关于f# - 如何匹配一个值的多个副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14561325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com