【问题标题】:Type error on a length function长度函数的类型错误
【发布时间】:2016-05-30 08:41:14
【问题描述】:

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

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>

但是当我通过我新创建的列表时,我收到以下错误:

错误:此表达式的类型为 int my_list 但是需要一个类型为“列表”的表达式

我错过了什么?

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

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    您实际上并没有使用自己的'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 类型。

    【讨论】:

    • 哦,我明白了!非常感谢您的帮助,这肯定会对我的其他功能有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2014-07-22
    • 2018-09-11
    • 2018-12-03
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    相关资源
    最近更新 更多