Sml 标准ML能否表示数据类型的子类型?

Sml 标准ML能否表示数据类型的子类型?,sml,union-types,subtyping,Sml,Union Types,Subtyping,有没有一种方法可以在SML中拥有一个数据类型的子类型,这样子类型就只能覆盖数据类型的一些构造函数?大概是这样的: (* 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

有没有一种方法可以在SML中拥有一个
数据类型的子类型
,这样子类型就只能覆盖
数据类型
的一些构造函数?大概是这样的:

(* 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
等值<代码>数据类型值构造函数位于值的域中,而类型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
现在您有了属于同一类型的值
哺乳动物(第9类)
爬行动物海龟
虚拟独角兽
。我对值构造函数使用大写字母,对类型名称使用小写字母,只是为了弄清楚什么是什么,即使这个约定在SML中没有严格执行。

这通常不是“subtype”的意思,但答案是否定的。