gpt4 book ai didi

.net - 如何使特定类型属于类型系列?

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

我正在尝试创建一个包含多种可能类型的集合。这是我希望它看起来如何的一个例子:

type Position = Vector2
type Velocity = Vector2
type Appearance = String

type Component = Position | Velocity | Appearance

let components = List<Dictionary<string, Component>>()
let pos = Dictionary<string, Position>()

components.Add(pos) // Type "Position" does not match with type "Component"

我想声明仍然适合一般类型的特定类型。有没有办法像这样编写我的代码?有没有更惯用的方法来做到这一点?

最佳答案

您的代码中有一些内容:

类型缩写 ( Link )

type Position = Vector2
type Velocity = Vector2
type Appearance = String

类型缩写只是为现有类型定义另一个名称,左边和右边的类型精确等效,可以互换使用。

举一个与此问题相关的示例,在 F# 中,标准 .NET 有一个类型缩写 List ,它被称为 ResizeArray .它是这样定义的:
type ResizeArray<'T> = System.Collections.Generic.List<'T>

它使您不必打开 System.Collections.Generic为了使用它,它有助于避免与 list 混淆。输入 F#,但除了为现有类型添加新名称外,它不会执行任何操作。

歧视工会 ( Link )
type Component = Position | Velocity | Appearance

这里有一个名为 Component 的类型,您可以将其视为具有三个构造函数的单一类型: Position , VelocityAppearance .您还可以通过模式匹配使用相同的三种情况再次解构类型。

例如
match comp with
|Position -> ..
|Velocity -> ..
|Appearance -> ..

希望现在,类型缩写 Position 应该不足为奇了。您声明的与工会案件无关 Position您声明为 Component 的一部分类型。它们彼此完全独立。
Position意味着 Vector2Component是一个完全独立的联合类型。

假设你想要一个 Component可能包含多个内容的类型,您需要将一些值与案例相关联。以下是创建此类歧视联盟的示例:
type Component = 
| Position of Vector2
| Velocity of Vector2
| Appearance of string

现在,让我们看看下一个问题。

如果我们删除类型缩写并使用我们新的 Discriminated Union 尝试其余的代码
let components = List<Dictionary<string, Component>>()
let pos = Dictionary<string, Position>()

我们现在有一个新的错误:

The type Position is not defined.



好吧,还记得我之前说的 Component . Component是类型, Position不是类型,它是 Component 的联合案例.

如果您想包含这些选项之一的整个字典,您可能最好将定义更改为如下所示:
type ComponentDictionary =
|PositionDictionary of Dictionary<string, Vector2>
|VelocityDictionary of Dictionary<string, Vector2>
|AppearanceDictionary of Dictionary<string, string>

然后你可以创建一个 ResizeArray/ List这些。
let components = ResizeArray<ComponentDictionary>()

现在,为了填充这个集合,我们只需要为 ComponentDictionary 使用适当的 case 构造函数。
let pos = PositionDictionary (Dictionary<string, Vector2>())

现在,pos 的类型是 ComponentDictionary所以我们可以将它添加到组件中:
components.Add(pos) // No error here!

关于.net - 如何使特定类型属于类型系列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38192119/

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