在EQUALOP中发现SML语法错误

时间:2014-09-24 13:29:27

标签: pattern-matching syntax-error sml

我必须编写一个关于检查元素e是否属于列表L然后返回true的程序。 我不想使用if,所以我尝试使用模式匹配。

我写这段代码:

member (e, []) = false
   |member (e, h=e::rest) = true
   |member (e, h::rest) = member (e, rest);

我得到''EQUALOP发现'语法错误''。 任何人都可以解释我必须改变的内容吗?

2 个答案:

答案 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 赋值。防爆。您可以检查truefalse之类的内容,它们代表它们自己,但不代表变量(这就是SML的定义方式)。即使您只想使用模式,也需要使用if … then … else

出于好奇,你可能会对想要保护模式匹配的假设sML(Successor ML)感兴趣:Match guards (successor-ml.org)