这将更接近有效的语法:
fun member (e, []) = false
|member (e, h as (e::rest)) = true
|member (e, h::rest) = member (e, rest);
注意“h as ...”。
仍然错误,因为“e”在第二个模式中重复,这是不允许的。
这在语法上是正确的:
fun member (e, []) = false
|member (e, h as (e2::rest)) = true
|member (e, h::rest) = member (e, rest);
但在逻辑上仍然不正确。正如 Sebastien 所提到的,按照您的意图,第二个模式 member (e, h as (e2::rest)) 最好写成 member (e, h::rest),这与第三个模式相同,因此最好删除以仅保留三个模式中的两个。
我必须编写一个程序来检查是否存在
元素e属于列表L
除了原始语法错误,您无法检查e 是否在列表中,与模式一样,在模式中,变量不会像常量一样被解释。在模式中,只有常量代表它们的值,相反,变量会被解构赋值。前任。您可以检查是否存在 true 或 false 之类的东西,它们代表它们自己,但不代表变量(这是 SML 的定义方式)。即使您只想使用模式,也需要使用if … then … else。
出于好奇,您可能对想要进行受保护模式匹配的假设 sML(Successor ML)感兴趣:Match guards (successor-ml.org)。