如何在 ML 中拥有不止一种类型?
How to have more than one type in ML?
ML 中是否可以允许 ML 中的变量具有多种类型?
例如,如果我希望树中的一个节点只能是一个整数或一个字符串。
Node of int * string
我试过了,但它只是产生了 (int, string) 的元组类型。我不希望它是一个元组,只是一个 int 或一个字符串。这允许吗?
正如评论中所指出的,您正在寻找的功能是联合类型。我相信它们在 SML 中的语法是:
datatype Node = IntNode of int
| StringNode of string
只是为了概括一下@TimDestan 的出色回答:具有 或者 一种类型 或 另一种类型的值的一般概念可以是编码为一个类型。例如,在 Haskell 和 Scala 中,我们有 Either
类型,它可以独占地保存两种不同类型的值。我们可以在 SML 中定义相同的内容:
datatype ('a, 'b) either = Left of 'a | Right of 'b
现在您可以将您的节点编码为:
Node of (int, string) either
节点可以这样构造:
Node (Left 1)
Node (Right "hello")
这比专门为这种情况定义自定义总和类型要轻一些。
ML 中是否可以允许 ML 中的变量具有多种类型?
例如,如果我希望树中的一个节点只能是一个整数或一个字符串。
Node of int * string
我试过了,但它只是产生了 (int, string) 的元组类型。我不希望它是一个元组,只是一个 int 或一个字符串。这允许吗?
正如评论中所指出的,您正在寻找的功能是联合类型。我相信它们在 SML 中的语法是:
datatype Node = IntNode of int
| StringNode of string
只是为了概括一下@TimDestan 的出色回答:具有 或者 一种类型 或 另一种类型的值的一般概念可以是编码为一个类型。例如,在 Haskell 和 Scala 中,我们有 Either
类型,它可以独占地保存两种不同类型的值。我们可以在 SML 中定义相同的内容:
datatype ('a, 'b) either = Left of 'a | Right of 'b
现在您可以将您的节点编码为:
Node of (int, string) either
节点可以这样构造:
Node (Left 1)
Node (Right "hello")
这比专门为这种情况定义自定义总和类型要轻一些。