我是 F# 的新手,对整个模式匹配的想法不太熟悉。我试图为我的问题寻找更好的解决方案,但我担心我什至无法正确表达问题——我希望问题标题至少有点准确。
我想要做的是从中提取 2 个“参数” listMethod
。
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 个参数(类型string
和Expression
)的类型而不自己列出它们,这有点难看且难以维护。
ListMethod
类型声明如下(整个就是一个 FsLex/FsYacc 项目):
type ListMethod =
| Select of string * Expr
| Where of string * Expr
| Sum of string * Expr
| Concat of string * Expr
| ...
| somethingElse of Expr
(到目前为止,我只有 form 的类型string * Expr
,但这会改变)。
我认为对于任何有经验的人来说,这都是一个相当愚蠢的问题,但正如我所说,我是 F# 的新手,自己找不到解决方案。
提前致谢!
编辑: 我真的很想避免列出所有可能的类型listMethod
两次。如果我无法在match
表达式中使用通配符或占位符,也许我可以修改listMethod
类型以使事情更清晰。
想到的一个选项是只创建一种类型,listMethod
并为具体类型创建第三个参数(Select、Where、Sum)。还是有更好的方法?