сопоставление с образцом и возврат нового объекта на основе рисунка - PullRequest
1 голос
/ 27 апреля 2010

скажем, у меня есть такой код

match exp with
| Addition(lhs,rhs,_) -> Addition(fix lhs,fix rhs)
| Subtraction(lhs,rhs,_) -> Subtraction(fix lhs,fix rhs)

есть ли способ, который позволил бы мне сделать что-то вроде

match exp with
| Addition(lhs,rhs,_)
| Subtraction(lhs,rhs,_) -> X(fix lhs,fix rhs)

где X основано на фактическом сопоставляемом шаблоне

Ответы [ 2 ]

7 голосов
/ 27 апреля 2010

Мне нравится ответ @ kvb.

Это предполагает, что вы можете переопределить DU, хотя:

type Op = | Add | Sub
type Expr = | Binary of Op * Expr * Expr
5 голосов
/ 27 апреля 2010

Вы можете использовать активный шаблон:

let (|Binary|_|) = function
| Addition(e1,e2) -> Some(Addition, e1, e2)
| Subtraction(e1,e2) -> Some(Subtraction, e1, e2)
| _ -> None

let rec fix = function
| Binary(con,lhs,rhs) -> con(fix lhs, fix rhs)
| _ -> ...
...