长度函数的类型错误

Type error on a length function

我有一个非常有趣的第一个学习 OCaml 的项目,在创建一个像这样的个人 list 类型之后:

type 'a my_list = Item of ('a * 'a my_list) | Empty;;

然后像这样填写:

let num_list = Item (1, Item (2, Item(3, Empty)));;

我必须重新编写列表模块的许多功能,这些功能将适应我的新列表类型,如上所示。

我从 Length 开始,这听起来最简单,也是一个很好的开始。

这是我目前的情况:

let rec length my_list =
match my_list with
| [] -> 0
| head::rest -> 1 + (length rest);;

哪个定义正确:

val length : 'a list -> int = <fun>

但是当我传递新创建的列表时,出现以下错误:

Error: This expression has type int my_list but an expression was expected of type 'a list

我错过了什么?

到目前为止,我很喜欢 OCaml,非常感谢您的帮助。

您实际上并不是在使用自己的 'a my_list 类型,而是使用原始的 'a list

您的函数必须进行模式匹配,不是 'a list 而是 'a my_list:

let rec my_length my_list = 
  match my_list with
  | Empty -> 0
  | Item (_, rest) -> 1 + (my_length rest);;

您现在得到的类型是:

val my_length : 'a my_list -> int = <fun>

现在您正在使用自己的 'a my_list 类型。