2014-11-03 66 views
2
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”]的选项。SML模式匹配抛“类型的规则不同意[tycon不匹配]”错误

我的问题是在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。这是怎么回事?

回答

4

这是由于嵌套的case表达式而引起的语法问题。解析器假定案例| x::xs' => ...是正在进行的案例表达式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)) 
+0

这工作 - 谢谢你! – JoshieSimmons 2014-11-04 19:29:37