小编Ser*_*dip的帖子

联盟成员的子集作为模式匹配中的"参数"

让我们为具有几种类型的二进制节点的树的类型定义,以及其他类型的节点,即

type Tree =
| BinaryNodeA of Tree * Tree
| BinaryNodeB of Tree * Tree
| [Other stuff...]
Run Code Online (Sandbox Code Playgroud)

我想使用递归函数来操纵这个树,该递归函数可以例如交换任何类型的二进制节点的子节点(通过构造新节点).让我疯狂的问题:如何匹配所有BinaryNodes,以便Node风格成为"参数",以便具有可应用于任何BinaryNode风格的通用交换,以返回该风味的交换节点?

我知道如何使用活动模式匹配所有BinaryNodes树:

let (|BinaryNode|_|) (tree : Tree) =
    match tree with
    | BinaryNodeA _ | BinaryNodeB _ -> Some(tree)
    | _ -> None
Run Code Online (Sandbox Code Playgroud)

但这还不够好,因为以下似乎无法实现:

match tree with
| [cases related to unary nodes..]
| BinaryNode a b -> BinaryNode b a
Run Code Online (Sandbox Code Playgroud)

换句话说,我还没有找到使用BinaryNode风格的方法,就像它是a和b之类的参数一样.相反,似乎我必须分别匹配每个BinaryNode风格.如果存在大量二进制节点风格,这可能具有实际意义.对于Fsyacc/Fslex生成的解析器/词法分析器,类型树是AST,它限制了重构它的选项.有任何想法吗?

f# discriminated-union active-pattern

3
推荐指数
1
解决办法
133
查看次数

标签 统计

active-pattern ×1

discriminated-union ×1

f# ×1