我正在尝试创建一个函数,使其输出一个删除相邻重复项的列表
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 []
我收到以下错误:
错误:此表达式的类型为“列表” 但预计表达式为'a 类型变量'a出现在'列表
中
为什么n想要输入'a而不是'列表?
答案 0 :(得分: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
?
<强>更新强>
您说您不能使用@
运算符。这实际上是合理的,因为以您想要的方式使用它并不是解决问题的好方法。 (一次一个地添加到列表末尾的东西很慢,即列表长度的二次时间。)
我可能会放弃太多,但解决这个问题的常用方法是以相反的顺序构建列表并在最后反转它。这只需要线性时间。