消除列表元素ocaml

时间:2018-05-07 21:29:01

标签: ocaml

我正在研究" 99 Ocaml问题"在解决方案中,我看到这种模式匹配:

let rec compress (mylist : 'a list) : 'a list = match mylist with
  |a::(b::_ as t) -> if a = b then compress t else a::compress t
  |smaller -> smaller

我理解对于第一个匹配的情况,如果元素a与元素b相同,那么我继续前进到列表t。如果没有,我会将元素a附加到压缩列表中。

对于第二个匹配的情况,我不确定"较小的"的类型是什么。

当我试图在它周围放一个方括号因为我认为作者想要将第二个案例与一个元素列表匹配,但我有一个非详尽的模式。

你能解释一下"较小的"在这种情况下?

2 个答案:

答案 0 :(得分:1)

变量smaller'a list。它匹配任何与早期分支不匹配的内容,即具有一个元素或空列表的列表。

答案 1 :(得分:0)

在没有compress的情况下编写smaller函数的另一种方法:

   let rec compress (mylist : 'a list) : 'a list = match mylist with
    | a::(b::_ as t) -> if a = b then compress t else a::compress t
    | _ -> mylist;;

其中与用户tbrk的答案相同:如果mylist与第一个表达式不匹配,则compress mylist会返回mylist