2014-02-17 76 views
0

我试图做一个功能,使得它输出列表中删除相邻的重复OCaml的预期类型“一

let rec rem_adj_duplicates l = 
    let rec utn l n = match l with 
     [] -> n 
     | (x :: y :: xs) -> if (x != y) then utn (y::xs) (n::x) 
      else utn (y::xs) n 
    in utn l [] 

我收到以下错误:

Error: This expression has type 'a list but an expression was expected of type 'a The type variable 'a occurs inside 'a list

为什么ñ希望键入'a而不是'列表?

回答

1

你有这样的:

if (x != y) then 
    utn (y::xs) (n::x) 
else 
    utn (y::xs) n 

在你n :: x第一个呼叫,它说,x是一个列表,n是一个非列表。此外它说utn的第二个参数是一个列表。在下一次通话中,您只需拨打n,该号码必须与其他通话的类型相同。因此,n显示为列表和非列表。

可能你想拥有x :: n而不是n :: x

更新

你说你不许使用@操作。这实际上是合理的,因为以你想要的方式使用它并不是解决问题的好方法。 (一次添加一个东西到列表的末尾是很慢的,即列表长度的二次时间。)

我可能会放弃太多,但解决此问题的常用方法是以相反的顺序构建列表,并在最后反转。这只需要线性时间。

+0

我想要的是将x添加到列表n的末尾。 –

+0

这是一个非常慢的操作,所以不是你真正想在生产代码中做的事情:-)但是这个表达式是'n @ [x]'。 –

+0

好吧,那有效,但我实际上只限于不使用@运算符:/ –