SML自定义数据类型相等,不带polyEqual

SML自定义数据类型相等,不带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

我试图编写一个函数来检查类型是否相等,忽略实例变量(不确定这是否是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

我知道在这种情况下可以通过使用模式匹配来实现,比如

fun myEqual (B _) (B _) = true
  | myEqual A A = true
  | myEqual _ _ = false;
但这只适用于这种特定的数据类型


SML中是否有只检查类型相等而不检查实例变量的操作?

首先,
数据类型D=A | B of int
只是一种具有两个分支的类型。所以你比较的是不同分支中不同形式的比较。我认为您必须分解数据类型才能编写这样的比较函数。因此,为每个数据类型编写
myEqual
函数是很自然的


其次,如果您想讨论两种独立的数据类型,那么进行这种比较是没有意义的。因为SML是静态的强类型,所以在编译时您知道每个变量的具体类型。

SML提供了比这更有力的保证。在编译时,您总是知道每个表达式的类型。