0

我有这个代码:

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,result) => ...

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

4

1 回答 1

2

当你写

| all_except_option(str::T, result) =

str这是一个隐藏旧参数的新绑定str。所以第二个模式h::t与最后一个模式具有相同的形式。

str您可以使用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
于 2013-01-26T22:51:43.517 回答