SML自定义数据类型相等,不带polyEqual
我试图编写一个函数来检查类型是否相等,忽略实例变量(不确定这是否是SML的正确术语)。优选地,该函数可以对多个数据类型进行操作 因此,如果我有: 数据类型D=int的A | BSML自定义数据类型相等,不带polyEqual,sml,Sml,我试图编写一个函数来检查类型是否相等,忽略实例变量(不确定这是否是SML的正确术语)。优选地,该函数可以对多个数据类型进行操作 因此,如果我有: 数据类型D=int的A | B myEqual A A、myEqual(b1)(b1)和myEqual(b1)(b2)都将返回true,而myEqual A(b1)将返回false 我的第一个想法是将其实现为类似fun myEqual a b=a=b。但是,这会比较两个变量的实例变量,这不是我想要的,因此myEqual(b1)(b2)将返回false
myEqual A A
、myEqual(b1)(b1)
和myEqual(b1)(b2)
都将返回true,而myEqual A(b1)
将返回false
我的第一个想法是将其实现为类似fun myEqual a b=a=b代码>。但是,这会比较两个变量的实例变量,这不是我想要的,因此myEqual(b1)(b2)
将返回false
我知道在这种情况下可以通过使用模式匹配来实现,比如
fun myEqual (B _) (B _) = true
| myEqual A A = true
| myEqual _ _ = false;
但这只适用于这种特定的数据类型
SML中是否有只检查类型相等而不检查实例变量的操作?首先,数据类型D=A | B of int
只是一种具有两个分支的类型。所以你比较的是不同分支中不同形式的比较。我认为您必须分解数据类型才能编写这样的比较函数。因此,为每个数据类型编写myEqual
函数是很自然的
其次,如果您想讨论两种独立的数据类型,那么进行这种比较是没有意义的。因为SML是静态的强类型,所以在编译时您知道每个变量的具体类型。SML提供了比这更有力的保证。在编译时,您总是知道每个表达式的类型。