Я новичок в 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
(на данный момент у меня есть только типы формы string * Expr
, но это изменится).
Я считаю, что это довольно глупый вопрос для любого, кто имеет некоторый опыт, но, как я уже сказал, я новичок в F # и не смог найти решение самостоятельно.
Спасибо ваванс!
Редактировать: Я бы очень хотел избежать перечисления всех возможных типов listMethod
дважды.Если я не могу использовать подстановочные знаки или заполнители в выражениях match
, возможно, я смогу изменить тип listMethod
, чтобы сделать вещи чище.
Один вариант, который приходит на ум, - это создание только 1 типаlistMethod
и создать третий параметр для конкретного типа (Выбрать, Где, Сумма).Или есть лучший подход?