gpt4 book ai didi

F# 模式匹配 : how to match a set of possible types that share the same parameters?

转载 作者:行者123 更新时间:2023-12-01 00:06:05 26 4
gpt4 key购买 nike

我是 F# 的新手,对整个模式匹配的想法不太熟悉。
我试图为我的问题寻找更好的解决方案,但我担心我什至无法正确表达这个问题——我希望问题标题至少有点准确。

我想要做的是从 listMethod 中提取 2 个“参数” .listMethod是具有字符串和 Expression 的几种类型之一“参数”(我怀疑参数是错误的术语):

    let (varDecl, listExpr) =
match listMethod with
| Select (var, expr) -> (var, expr)
| Where (var, expr) -> (var, expr)
| Sum (var, expr) -> (var, expr)
| Concat (var, expr) -> (var, expr)

然后我继续与 varDecl 合作最后有一个与实际 listMethod 代码类似的匹配表达式,它使用了我基于 varDecl 创建的几个临时变量.

我现在的问题是:我怎样才能使上面的代码更紧凑?

我想匹配所有具有 2 个参数的类型(类型为 stringExpression )而不自己列出它们,这有点难看且难以维护。
ListMethod类型声明如下(整个是一个 FsLex/FsYacc 项目):
type ListMethod =
| Select of string * Expr
| Where of string * Expr
| Sum of string * Expr
| Concat of string * Expr
| ...
| somethingElse of Expr

(到目前为止,我只有 string * Expr 形式的类型,但这会改变)。

我认为这对于任何有经验的人来说都是一个相当愚蠢的问题,但正如我所说,我是 F# 的新手,自己找不到解决方案。

提前致谢!

编辑:我真的很想避免列出所有可能的 listMethod 类型。两次。如果我无法在 match 中使用通配符或占位符表达式,也许我可以修改 listMethod键入以使事情更清洁。

想到的一个选项是只创建一种类型的 listMethod并为具体类型创建第三个参数(Select、Where、Sum)。
还是有更好的方法?

最佳答案

这可能是标准方式:

let (varDecl, listExpr) =
match listMethod with
| Select (var, expr)
| Where (var, expr)
| Sum (var, expr)
| Concat (var, expr) -> (var, expr)
|符号表示 or ,因此如果其中之一匹配,则将返回结果。只需确保每个案例都具有完全相同的名称(和类型)。

正如 Chuck 评论的那样,这是一个更好的解决方案:
let (Select (varDecl, expr)
| Where (varDecl, expr)
| Sum (varDecl, expr)
| Concat (varDecl, expr)) = listMethod

关于F# 模式匹配 : how to match a set of possible types that share the same parameters?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7239915/

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