我目前在学习SML,并且对于我没有名字的东西有疑问。现在让我们称之为“输入别名”。假设我有以下数据类型定义:SML中的类型推断
datatype 'a stack = Stack of 'a list;
我现在想添加一个明确的“空栈”类型。我可以这样将它添加到数据类型:
datatype 'a stack = emptystack | Stack of 'a list;
现在我可以匹配模式像“推送”功能:
fun push (emptystack) (e:'a) = Stack([e])
| push (Stack(list):'a stack) (e:'a) = Stack(e::list);
这里的问题是,Stack([])
和emptystack
是不同的,但我想他们是一样的。因此,每当SML遇到Stack([])
时,它应该“知道”这是emptystack
(在推送的情况下它应该使用空堆匹配)。
有没有办法做到这一点?
只是为了记录,它被称为*推理*,而不是*干扰*。 SML编译器*推断*表达式的类型。它不*干扰* :) – jalf
这引发了一个问题:*为什么*你甚至想要这样做?第二版“栈”比第一版更受欢迎?通常,人们想要删除多余的案例,而不是引入它们。 –