OCaml - 为什么我的函数类型'列表 - > ......而不是'清单?

时间:2017-05-17 16:59:02

标签: ocaml

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的标准列表?

1 个答案:

答案 0 :(得分:4)

我看到两个问题。在第一种情况下,您将返回{!! !!}。但是你应该返回一个列表,h是你列表中的第一个元素。

在第二种情况下,您使用h运算符,该运算符需要双方列表。但是@是列表中的第一个元素,而不是列表。您可以使用h代替::来解决此问题。

其他问题:

我没有看到您处理空列表的地方@

您应该使用l而不是=。 OCaml中的==运算符仅用于非常特殊的目的。对于日常的平等比较,您希望使用==