【问题标题】:This expression has type 'a list but an expression was expected of type 'a此表达式的类型为 'a 列表,但表达式应为 'a 类型
【发布时间】:2018-03-31 05:00:43
【问题描述】:

我在 OCaml 中有一个函数应该合并两个列表:

let rec merge (list1, list2) = 
    match (list1, list2) with
        ([], []) -> merge (List.tl list1, List.tl list2) :: List.hd list1 :: List.hd list2
        |(_, []) -> merge (List.tl list1, list2) :: List.hd list1
        |([], _) -> merge (list1, List.tl list2) :: List.hd list2;;

但由于某种原因,编译器不允许此代码退出:

错误:此表达式的类型为 'a list 但是需要一个类型为 'a 的表达式 类型变量 'a 出现在 'a 列表中

我如何指定这些是我正在尝试通过的“a”列表,而不是“a”?

【问题讨论】:

    标签: list ocaml typeerror cons


    【解决方案1】:

    首先,这个功能不起作用。如果两个列表为空,则合并尾部并连接每个列表的头部,但是......嗯......它们是空的......

    无论如何,您的问题是您正在使用类型为 'a -> 'a list -> 'a list:: 运算符(连接),所以左边的成员应该是一个元素,右边的成员应该是一个列表,这里左边的是列表和正确的元素,所以它不能工作。

    关于你的问题,由于类型是推断出来的,你不能告诉编译器你是对的,他是错的,在这种情况下,错误是真正明确的:

     List.tl l (* 'a list *) :: List.hd l (* 'a *)
    

    总是会返回错误,因为你有一个无限类型(因为::'a -> 'a list -> 'a list 类型,我让你尝试确定一个可以与你的串联匹配的有限类型'a

    所以,我猜你想要做的是这样的:

    let rec merge (list1, list2) = 
        match list1, list2 with
            | [], _ -> list2;;
            | hd :: tl, _ -> hd :: merge tl list2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-06
      • 1970-01-01
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多