SML 模式匹配抛出“规则类型不同意 [tycon mismatch]”错误

Jos*_*ons 2 sml pattern-matching

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)
Run Code Online (Sandbox Code Playgroud)

它使用一个辅助函数,该函数接受一个字符串列表,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>
Run Code Online (Sandbox Code Playgroud)

但我不明白为什么,因为我试图匹配的模式调用SOME lst但它描述为string list list. 这是怎么回事?

wal*_*pus 5

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

如果将内部 case 表达式括在括号中,函数定义将进行解析。

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))
Run Code Online (Sandbox Code Playgroud)