标准ML可以表达数据类型的子类型吗



有没有办法在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值构造函数(CatDog等(是否可以重载多种类型?答案是否定的。这恰好是函数语言中不常见的特征。有些函数式语言具有一定程度的值重载特性。

你可以说你的宠物类型是动物的一个子类型,就像值是一个子类型一样,即使SML不以这种方式处理子类型。第三次尝试type Pet = Cat | Dog是不可能的,因为type用于别名,这些别名不能有自己的唯一构造函数,只能引用现有的类型而不是(如CatDog(;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 TurtleFictive Unicorn。我在值构造函数中使用了大写,在类型名称中使用了小写,只是为了明确什么是什么,尽管这种约定在SML.中没有严格执行

最新更新