【发布时间】:2012-05-04 11:26:30
【问题描述】:
我目前正在学习 SML,我有一个关于我没有名字的问题的问题。我们暂时称它为“类型别名”。假设我有以下数据类型定义:
datatype 'a stack = Stack of 'a list;
我现在想添加一个显式的“空堆栈”类型。我可以通过将其添加到数据类型来实现这一点:
datatype 'a stack = emptystack | Stack of 'a list;
现在我可以对“push”之类的函数进行模式匹配:
fun push (emptystack) (e:'a) = Stack([e])
| push (Stack(list):'a stack) (e:'a) = Stack(e::list);
这里的问题是Stack([]) 和emptystack 不同,但我希望它们相同。因此,每次 SML 遇到 Stack([]) 时,它都应该“知道”这是 emptystack(在推送的情况下,它应该使用空堆栈匹配)。
有没有办法做到这一点?
【问题讨论】:
-
只是为了记录,它被称为inference,而不是interference。 SML 编译器推断表达式的类型。它不会干扰 :)
-
这引出了一个问题:为什么你甚至想这样做?
stack的第二个版本比第一个更好吗?通常,人们希望删除多余的案例而不是引入它们。
标签: sml