【问题标题】:SML Function Argument Pattern MatchingSML 函数参数模式匹配
【发布时间】:2012-09-02 03:58:57
【问题描述】:

我在传递给函数的参数上使用模式匹配。可以说,该方法对于“第一级”匹配效果很好,但是任何更深入的尝试都会给出错误“stdIn:282.5-291.77 Error: matchredundant

例子

fun nnf T = T
    | nnf F = F
    | nnf (LETTER(x)) = (LETTER(x))
    | nnf (NEG(x)) = (NEG(nnf x))
    | nnf (AND(x,y)) = (AND(nnf x, nnf y))
    | nnf (OR(x,y)) = (OR(nnf x, nnf y))
    | nnf (IMP(x,y)) = (OR(NEG(nnf x),(nnf y)))
    | nnf (NEG(NEG(LETTER(x)))) = (LETTER(x))
    | nnf (NEG(AND(LETTER(x),LETTER(y)))) = (OR(NEG(LETTER(x)),NEG(LETTER(y))))
    | nnf (NEG(OR(LETTER(x),LETTER(y)))) = (AND(NEG(LETTER(x)),NEG(LETTER(y))));
val nnf = fn : prop -> prop

我得到的错误是

stdIn:282.5-291.77 Error: match redundant
          T => ...
          F => ...
          LETTER x => ...
          NEG x => ...
          AND (x,y) => ...
          OR (x,y) => ...
          IMP (x,y) => ...
    -->   NEG (NEG (LETTER x)) => ...
    -->   NEG (AND (LETTER x,LETTER y)) => ...
    -->   NEG (OR (LETTER x,LETTER y)) => ...

所以 SML 是说函数定义中的最后 3 个子句是相同的,因为它们都以“(NEG(...”)开头,即使后面的内容不同。

我该如何克服?

【问题讨论】:

    标签: functional-programming logic sml smlnj


    【解决方案1】:

    案例NEG(x) 已经涵盖了涉及最外层NEG 的任何可能案例,因此永远无法触及其他案例。根据您实际想要实现的目标,要么删除该案例,要么将其移到更具体的案例之后(按顺序尝试案例)。

    【讨论】:

      猜你喜欢
      • 2020-07-30
      • 1970-01-01
      • 2017-06-10
      • 1970-01-01
      • 2020-06-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多