Sml 如何检查a";“设置”;没有cons操作员

Sml 如何检查a";“设置”;没有cons操作员,sml,ml,abstract-data-type,Sml,Ml,Abstract Data Type,这是一个代码示例,我可以想象它在以列表形式实现的集合数据类型中工作良好: fun newSet() = nilset; fun isMember (k, x::xs) = if k = x then true else isMember (k, xs) | isMember (k, nilset) = false; 问题是我无法将其作为列表来实现。下面是实现我的集合的代码 abstype ''a set = nilset | st of ''a * ''a set 如果:用于列表,如何

这是一个代码示例,我可以想象它在以列表形式实现的集合数据类型中工作良好:

fun newSet() = nilset;

fun isMember (k, x::xs) = if k = x then true else isMember (k, xs)
  | isMember (k, nilset) = false;
问题是我无法将其作为列表来实现。下面是实现我的集合的代码

abstype ''a set = nilset | st of ''a * ''a set
如果
用于列表,如何递归执行此操作和其他设置操作?如果不是,为什么会抛出异常?当我使用
时,我得到了这个:

! Type clash: pattern of type
!   ''a set
! cannot have type
!   ''b list

谢谢你的帮助。

这也不例外;这是一个类型错误,说明您不能使用属于
列表的cons构造函数
集合

假设递归数据类型中有两个构造函数
Nilset
Set

datatype 'a set = Nilset | Set of 'a * 'a set
您应该按照数据类型的递归结构来定义
isMember

fun isMember (k, Set(x, xs)) = k = x orelse isMember (k, xs)
  | isMember (k, Nilset) = false

当然,要认真使用
Set
,您应该仔细查看。

好的,谢谢。我以前从未用ML编码过。我有一点Java的背景,但我希望能扩展一下。非常感谢!我添加了一个完整的示例。希望这能帮助你开始。