有一对夫妇的事情,你在你的代码在这里有:
类型缩写(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
和它有助于避免与F#中list
类型混乱,但它并没有做其他比添加一个新的名称,也现有类型。
Disciminated工会(Link)
type Component = Position | Velocity | Appearance
在这里,你有一个单一的类型,称为Component
,你可以把它作为一个单一类型三个构造函数:Position
,Velocity
和Appearance
。您还可以通过模式匹配使用相同的三种情况再次解构类型。
例如
match comp with
|Position -> ..
|Velocity -> ..
|Appearance -> ..
希望,它现在应该是毫不奇怪,你声明的类型缩写Position
与工会的情况下Position
你宣布为Component
类型的一部分没有任何联系。他们完全相互独立。
Position
意味着Vector2
和Component
是一个完全独立的联合类型。
假设您想要一个可包含多个事物的Component
类型,您需要将某些值与案例相关联。下面是建立这样一个区分联合的例子:
type Component =
| Position of Vector2
| Velocity of Vector2
| Appearance of string
现在,让我们来看看下一个问题。
如果我们删除该类型的缩写和尝试的代码的其余部分与我们的新识别联合
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
let pos = PositionDictionary (Dictionary<string, Vector2>())
现在,pos是ComponentDictionary
型的,所以我们可以把它添加到组件:
components.Add(pos) // No error here!
你知道Component.Position和Position不是同一个吗? –