【问题标题】:SML Pattern matching throwing "types of rules don't agree [tycon mismatch]" errorSML 模式匹配抛出“规则类型不同意 [tycon mismatch]”错误
【发布时间】:2014-12-30 16:53:04
【问题描述】:
fun sample(list_of_str_lists, s) =
    case list_of_str_lists of
           [] => []
        | x::[] => case (all_except_option(s, x)) of
                        SOME lst => lst
                      | NONE => []
        | x::xs' => case (all_except_option(s, x)) of
                        SOME lst => lst @ sample(xs', s)
                      | NONE => [] @ sample(xs', s)

如果该列表中有匹配的字符串(同样,不包括匹配的字符串),它使用一个辅助函数来获取字符串列表并在list option 中返回该列表中的所有元素。因此,辅助函数将获取一个列表["a", "b", "c"] 和一个字符串"a",如果它匹配"a",将返回一个包含["b", “c”] 的选项。

我的问题出在最后一个模式匹配分支的sample 中。它抛出错误

earlier rule(s): 'Z list option -> 'Z list
  this rule: string list list -> string list
  in rule:
    :: (x,xs') =>
      (case (all_except_option (s,x))
        of SOME lst => lst @ sample <exp>
         | NONE => nil @ sample <exp>

但我不明白为什么,因为我尝试匹配的模式调用了SOME lst,但它却将其描述为string list list。怎么回事?

【问题讨论】:

    标签: pattern-matching sml


    【解决方案1】:

    这是由于嵌套的case 表达式导致的语法问题。解析器假定 case | x::xs' =&gt; ... 是正在进行的 case 表达式 case (all_except_option(s, x)) of ... 的延续,因为它无法判断它实际上是属于封闭表达式 case list_of_str_lists of ...

    如果你用括号括住内层表达式,函数定义将被解析。

    fun sample(list_of_str_lists, s) =
      case list_of_str_lists of
        []     => []
      | x::[]  => (case (all_except_option(s, x)) of
                     SOME lst => lst
                   | NONE     => [])
      | x::xs' => (case (all_except_option(s, x)) of
                      SOME lst => lst @ sample(xs', s)
                    | NONE     => [] @ sample(xs', s))
    

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 2018-04-28
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 2016-10-24
      相关资源
      最近更新 更多