说我有一些像这样的代码
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基于匹配的实际模式
答案 0 :(得分:7)
我喜欢@ kvb的回答。
这确实表明你可能想要重新定义DU,但是:
type Op = | Add | Sub
type Expr = | Binary of Op * Expr * Expr
答案 1 :(得分:5)
您可以使用活动模式:
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)
| _ -> ...