【问题标题】:SML syntax error found at EQUALOP在 EQUALOP 发现 SML 语法错误
【发布时间】:2014-09-25 02:44:16
【问题描述】:

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

我写了这段代码:

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

我得到“在 EQUALOP 发现语法错误”。 谁能解释我必须改变什么?

【问题讨论】:

    标签: pattern-matching syntax-error sml


    【解决方案1】:

    您不能在模式中使用=(或任何其他运算符或函数)。

    您需要使用(e, h::rest) 模式,然后使用if e = h then ... else ... 来检查它们是否相等。

    【讨论】:

      【解决方案2】:

      这将更接近有效的语法:

      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 是否在列表中,与模式一样,在模式中,变量不会像常量一样被解释。在模式中,只有常量代表它们的值,相反,变量会被解构赋值。前任。您可以检查是否存在 truefalse 之类的东西,它们代表它们自己,但不代表变量(这是 SML 的定义方式)。即使您只想使用模式,也需要使用if … then … else

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

      【讨论】:

        猜你喜欢
        • 2013-01-05
        • 2015-04-10
        • 2013-01-31
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 1970-01-01
        • 2013-01-10
        相关资源
        最近更新 更多