ML中的模式匹配

时间:2013-01-26 22:22:09

标签: pattern-matching sml ml

我有这段代码:

fun all_except_option2(str : string, strlst : string list) =
    let fun all_except_option([], result) = NONE
    | all_except_option(str::T, result) = SOME(List.rev(result) @ T)
    | all_except_option(H::T, result) =all_except_option(T, H::result)
    in
    all_except_option(strlst, [])
    end

并且编译器说:

  

hw2provided.sml:22.13-24.70错误:匹配冗余(nil,result)=> ...   (str :: T,result)=> ... - > (H :: T,结果)=> ...

我已经用“case of case”处理了这个问题,但我的问题是语言不与str(从上面)进行模式匹配?为什么编译器认为str就像H一样。

1 个答案:

答案 0 :(得分:2)

写作时

| all_except_option(str::T, result) =

str这是一个新的绑定,它会遮蔽旧参数str。因此第二种模式与最后一种模式具有相同的形式h::t

您可以使用str construct:

将值与参数if/else进行比较
fun all_except_option2(str: string, strlst: string list) =
  let 
     fun all_except_option([], result) = NONE
      | all_except_option(h::t, result) = if h = str 
                                          then SOME(List.rev(result) @ t)
                                          else all_except_option(t, h::result)
  in
     all_except_option(strlst, [])
  end