开发者

pattern matching and returning new object based on pattern

开发者 https://www.devze.com 2022-12-28 21:54 出处:网络
Say I\'ve got some code like this match exp with Addition(lhs,rhs,_) -> Addition(fix lhs,fix rhs) Subtraction(lhs,rhs,_) -> Subtraction(fix lhs,fix rhs)

Say I've got some code like this

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

is there any way that would allow m开发者_C百科e to do something like

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

where X be based on the actual pattern being matched


I like @kvb's answer.

This does suggest that you may want to redefine the DU, though:

type Op = | Add | Sub
type Expr = | Binary of Op * Expr * Expr


You can use an active pattern:

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)
| _ -> ...
0

精彩评论

暂无评论...
验证码 换一张
取 消