我目前正在学习 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
(在推送的情况下它应该使用空堆栈匹配)。
有没有办法做到这一点?