let rec slice l i k = match l with
h::t -> if (k == 0) then h
else if (i == 0) then h @ (slice t 0 (k-1))
else slice t (i-1) (k-1);;
当我输入slice [1; 2; 3; 4] 1 2;;
时,我得到:
Error: This expression has type int but an expression was expected of type 'a list
但是,如果我输入slice [[1]; [2]; [3]; [4]] 1 2;;
,它就会按预期工作。我不明白为什么OCaml认为我是'a的列表,而不仅仅是'a的标准列表?
答案 0 :(得分:4)
我看到两个问题。在第一种情况下,您将返回{!! !!}
。但是你应该返回一个列表,h
是你列表中的第一个元素。
在第二种情况下,您使用h
运算符,该运算符需要双方列表。但是@
是列表中的第一个元素,而不是列表。您可以使用h
代替::
来解决此问题。
其他问题:
我没有看到您处理空列表的地方@
。
您应该使用l
而不是=
。 OCaml中的==
运算符仅用于非常特殊的目的。对于日常的平等比较,您希望使用==
。