模式匹配并基于模式返回新对象

时间:2010-04-27 18:09:43

标签: f# pattern-matching

说我有一些像这样的代码

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 个答案:

答案 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)
| _ -> ...