gpt4 book ai didi

f# - 联盟成员的子集在模式匹配中为 "parameter"

转载 作者:行者123 更新时间:2023-12-05 01:02:09 25 4
gpt4 key购买 nike

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

type Tree =
| BinaryNodeA of Tree * Tree
| BinaryNodeB of Tree * Tree
| [Other stuff...]

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

我知道如何使用事件模式匹配所有二元节点树:

let (|BinaryNode|_|) (tree : Tree) =
match tree with
| BinaryNodeA _ | BinaryNodeB _ -> Some(tree)
| _ -> None

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

match tree with
| [cases related to unary nodes..]
| BinaryNode a b -> BinaryNode b a

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

最佳答案

您只需要更改事件模式的定义:

type Flavor = A | B

let (|BinaryNode|_|) (tree : Tree) =
match tree with
| BinaryNodeA(x,y) -> Some(A,x,y)
| BinaryNodeB(x,y) -> Some(B,x,y)
| _ -> None

let mkBinaryNode f t1 t2 =
match f with
| A -> BinaryNodeA(t1,t2)
| B -> BinaryNodeB(t1,t2)

然后你可以像这样实现你想要的:

match tree with
| [cases related to unary nodes..]
| BinaryNode(f,t1,t2) -> mkBinaryNode f t2 t1

但如果这是一个普遍的需求,那么改变 Tree 的定义以包含 flavor 而不是使用事件模式来处理它可能是有意义的。

关于f# - 联盟成员的子集在模式匹配中为 "parameter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40847815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com