SML中的类型推断

SML中的类型推断,sml,Sml,我目前正在学习SML,我有一个关于一些我没有名字的问题。现在让我们称之为“类型别名”。假设我有以下数据类型定义: datatype 'a stack = Stack of 'a list; 现在我想添加一个显式的“空堆栈”类型。我可以通过将其添加到数据类型来解决此问题: datatype 'a stack = emptystack | Stack of 'a list; 现在我可以匹配一个函数,比如“push”: 这里的问题是Stack([])和emptystack是不同的,但我希望它们是相

我目前正在学习SML,我有一个关于一些我没有名字的问题。现在让我们称之为“类型别名”。假设我有以下数据类型定义:

datatype 'a stack = Stack of 'a list;
现在我想添加一个显式的“空堆栈”类型。我可以通过将其添加到数据类型来解决此问题:

datatype 'a stack = emptystack | Stack of 'a list;
现在我可以匹配一个函数,比如“push”:

这里的问题是
Stack([])
emptystack
是不同的,但我希望它们是相同的。因此,每次SML遇到
堆栈([])
时,它都应该“知道”这是
清空堆栈(
)(在push的情况下,它应该使用清空堆栈匹配)


有没有办法做到这一点?

这样的别名在SML中是不可能的

相反,如果您希望的话,您应该将数据类型设计为在其表示中明确无误

您可能更适合使用类似于列表定义的内容更多:

datatype 'a stack = EmptyStack | Stack of 'a * 'a stack;

这样做的缺点是不允许您在其上使用列表函数,但您确实会得到一个显式的空堆栈构造函数。

这样的别名在SML中是不可能的

相反,如果您希望的话,您应该将数据类型设计为在其表示中明确无误

您可能更适合使用类似于列表定义的内容更多:

datatype 'a stack = EmptyStack | Stack of 'a * 'a stack;

这样做的缺点是不允许您在其上使用列表函数,但您确实会得到一个显式的空堆栈构造函数。

简短的回答是:不,这是不可能的

您可以使用代码创建类型别名

type number = int

val foo : number -> int -> number =
 fn a => fn b => a+b

val x : int = foo 1 3;
val y : number = foo 1 3;

但是,正如名字所说,它只适用于类型。你的问题是关于值构造函数,它没有语法。

简短的回答是:不,这是不可能的

您可以使用代码创建类型别名

type number = int

val foo : number -> int -> number =
 fn a => fn b => a+b

val x : int = foo 1 3;
val y : number = foo 1 3;

但是,正如名字所说,它只适用于类型。你的问题是关于值构造函数,它没有语法。

因为你想要的是一个值
清空堆栈
与另一个值
堆栈[]
同义,所以你可以调用你想要的“值别名”。与内置运算符
=
或模式匹配进行比较的值将不允许使用别名

您可以通过创建自己的相等运算符来实现这一点,但是您将失去使用内置的
=
(因为标准ML不支持自定义运算符重载)的能力,以及在您的类型的值构造函数上进行模式匹配的能力


或者,您可以为您的类型构造一个范式,并始终比较范式。只要切实可行,遵循塞巴斯蒂安的建议,不要含糊其辞。在某些情况下,明确的代数类型可能比允许以不同方式表示相同值的简单代数类型复杂得多。

因为您希望一个值
emptystack
与另一个值
Stack[]
同义,所以可以调用您正在查找的值“值别名”。与内置运算符
=
或模式匹配进行比较的值将不允许使用别名

您可以通过创建自己的相等运算符来实现这一点,但是您将失去使用内置的
=
(因为标准ML不支持自定义运算符重载)的能力,以及在您的类型的值构造函数上进行模式匹配的能力


或者,您可以为您的类型构造一个范式,并始终比较范式。只要切实可行,请遵循Sebastian关于无歧义的建议。在某些情况下,明确的代数类型可能比允许以不同方式表示相同值的简单代数类型复杂得多s、

只是为了记录,它被称为推断,而不是干扰。SML编译器推断表达式的类型。它不干扰:)这就引出了一个问题:你为什么要这样做?第二个版本的
堆栈如何比第一个版本更可取?通常,人们希望删除多余的案例,而不是引入它们。Jus记录在案,它被称为推断,而不是干扰。SML编译器推断表达式的类型。它不干扰:)这就引出了一个问题:你为什么要这样做?第二个版本的
stack
比第一个版本更可取吗?通常,人们希望删除多余的情况,而不是引入它们。