2014-11-03 67 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