gpt4 book ai didi

f# - 在 F# 中建模复杂的层次结构

转载 作者:行者123 更新时间:2023-12-04 18:03:32 27 4
gpt4 key购买 nike

我对 F# 还很陌生,我想对现实世界中具有相当复杂的“has-a”关系的事物进行建模。层次结构的顶部是四种类型,A - D,具有以下关系:

A
|
+--A
|
+--B
| |
| +--B
| |
| +--D
| |
| +--D
|
+--C
| |
: +--D
| |
| +--D
:

所以类型 B 可以有 A 或 B 的“父级”,类型 D 可以有 B、C 或 D 的父级。

我想使用有区别的联合来约束每种类型的父级,因此不能将它们分配给无效的父级,例如:
type B_Parent = A | B
type D_Parent = B | C | D

然后我想使用记录对每种类型进行建模,其中一个字段是父字段,例如:
type A = { parent:A_Parent; ... }
type B = { parent:B_Parent; ... }
type C = { parent:C_Parent; ... }
type D = { parent:D_Parent; ... }

C_Parent 不是问题,因为它的父类型 A 是事先声明的。我为 A_Parent 使用了“A 选项”。但是我一直无法弄清楚如何定义 B_Parent 和 D_Parent,因为它们对自身和其他类型的嵌套依赖?

最佳答案

首先,一件非常重要的事情:当你写作时

type B_Parent = A | B

你是 不是 声明 B_Parent是加入两个先前定义的类型 A 的 DU和 B .没有语法。

上面这行实际上是在定义 B_Parent 的两个空子类型。 ,与原文无关 AB .它相当于:
type B_Parent = B_Parent.A | B_Parent.B

为了在 DU 中重用现有类型,您需要为案例命名 - 有效地将它们包装在另一种类型中。所以正确的声明可以是这样的:
type B_Parent = P_a of A | P_b of B

除此之外 - 正如安东所说,定义相互引用类型的关键字是 and .也就是说,最好使这种相互引用尽可能小而紧密。所以我们可以做这样的事情:
type A = { parent:A_Parent; ... }
and A_Parent = P_a of A
| None

type B = { parent:B_Parent; ... }
and B_Parent = P_a of A
| P_b of B

type C = { parent:C_Parent; ... }
and C_Parent = P_a of A

type D = { parent:D_Parent; ... }
and D_Parent = P_b of B
| P_c of C
| P_d of D

我们本可以只使用 A optionA_Parent ,而只是 AC_Parent ,但我认为保持大小写名称一致可能会使事情更具可读性。

关于f# - 在 F# 中建模复杂的层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37673650/

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