我必须编写一个关于检查元素e是否属于列表L然后返回true的程序。 我不想使用if,所以我尝试使用模式匹配。
我写这段代码:
member (e, []) = false
|member (e, h=e::rest) = true
|member (e, h::rest) = member (e, rest);
我得到''EQUALOP发现'语法错误''。 任何人都可以解释我必须改变的内容吗?
答案 0 :(得分:1)
您不能在模式中使用=
(或任何其他运算符或函数)。
您需要使用(e, h::rest)
模式,然后使用if e = h then ... else ...
检查它们是否相等。
答案 1 :(得分:0)
这将更接近有效的语法:
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);
但仍然没有逻辑正确。正如塞巴斯蒂安提到的那样,根据你的意图,第二种模式member (e, h as (e2::rest))
最好写成member (e, h::rest)
,这与第三种模式相同,因此最好只删除三种模式中的两种模式
我必须写一个程序来检查是否有 元素e属于列表L
除了原始语法错误之外,您无法检查e
是否在列表中,使用模式,如在模式中,变量不会被解释为常量。在模式中,只有常量代表它们的值,相反,变量将通过 destructuring 赋值。防爆。您可以检查true
或false
之类的内容,它们代表它们自己,但不代表变量(这就是SML的定义方式)。即使您只想使用模式,也需要使用if … then … else
。
出于好奇,你可能会对想要保护模式匹配的假设sML(Successor ML)感兴趣:Match guards (successor-ml.org)。