原谅我对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 *)
答案 0 :(得分:1)
表达式a :: b
是一个头部为a
且尾部为b
的列表。那么表达式[a :: b]
就是一个列表列表。您的模式很可能应为h1 :: t1
和h2 :: 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所指出的。
如果我做了两个更改,我没有看到任何进一步的类型错误。还有其他错误,但它们不是类型错误。