为什么这不是一个清单?

时间:2017-10-03 00:01:29

标签: list recursion pattern-matching ocaml typeerror

原谅我对OCaml的新见,但我有一个非常简单的功能,我将返回两个列表的交集,但只有当元素同时在两个列表中时才会返回。在第三行,我告诉"这个表达式有类型' a但表达式需要类型'列表",但不是列表我正在输出?

 let rec intersection (l1 : 'a list) (l2 : 'a list) : 'a list = match l1,l2 with
  | [],[] -> []             (* empty lists *)
  | [h1::t1], [h2::t2] ->   (* non-empty lists *)
      if h1 = h2          (* if both elements are the same *)
        then h1 :: intersection(t1,t2)   (* include in intersection response *)
        else intersection(t1, t2)        (* else ignore it and check the remaining elements *)

1 个答案:

答案 0 :(得分:1)

表达式a :: b是一个头部为a且尾部为b的列表。那么表达式[a :: b]就是一个列表列表。您的模式很可能应为h1 :: t1h2 :: t2

如果您将整个功能发布为@PieOhPah指出,那么帮助会更容易。

<强>更新

您的代码中至少有两个错误。如果我按上面给出的编译代码,我会看到:

File "a1.ml", line 5, characters 13-15:
Error: This expression has type 'a but an expression was expected of type
     'a list
     The type variable 'a occurs inside 'a list

如果我将您的模式从[h1 :: t1], [h2 :: t2]更改为h1 :: t1, h2 :: t2,我会看到:

File "a2.ml", line 5, characters 31-38:
Error: This expression has type 'b * 'c
   but an expression was expected of type 'a list

发生第二个错误是因为您对intersection的递归调用正在传递元组intersection (a, b)。但intersection以curry形式定义,即它需要单独的参数intersection a b。这就是@PieOhPah所指出的。

如果我做了两个更改,我没有看到任何进一步的类型错误。还有其他错误,但它们不是类型错误。