有没有办法在SML中拥有datatype
的子类型,以便该子类型只覆盖datatype
的一些构造函数?类似这样的东西:
(* This works as expected *)
datatype Animal = Cat | Dog | Elephant | Zebra;
(* This overrides the Animal constructors instead of co-opting them *)
datatype Pet = Cat | Dog;
(* This causes a syntax error *)
type Pet = Cat | Dog;
我将添加到@molbdnilo的答案中:您的意思是,datatype
值构造函数(Cat
、Dog
等(是否可以重载多种类型?答案是否定的。这恰好是函数语言中不常见的特征。有些函数式语言具有一定程度的值重载特性。
你可以说你的宠物类型是动物的一个子类型,就像值是一个子类型一样,即使SML不以这种方式处理子类型。第三次尝试type Pet = Cat | Dog
是不可能的,因为type
用于别名,这些别名不能有自己的唯一构造函数,只能引用现有的类型而不是值(如Cat
和Dog
(;datatype
值构造函数生活在值的域中,而类型Pet和Animal生活在类型的域中。
因此,您可以使用参数化的值构造函数:
type lives = int
datatype mammal = Cat of lives | Dog
datatype reptile = Turtle | Lizard
datatype fictive = Unicorn
datatype animal = Mammal of mammal
| Reptile of reptile
| Fictive of fictive
现在有了属于同一类型的值Mammal (Cat 9)
、Reptile Turtle
和Fictive Unicorn
。我在值构造函数中使用了大写,在类型名称中使用了小写,只是为了明确什么是什么,尽管这种约定在SML.中没有严格执行