该表达式的代码错误,该表达式的类型为列表,但是期望表达式的类型为a,类型变量a出现在列表中

时间:2019-04-19 12:35:35

标签: ocaml

此错误发生在我的两个任务上,我不知道该如何解决 帮助

let rec ins (l1, l2) i = match l1 with
| [] -> []
| _  when i>List.length(l1) ->[] 
| _  when i=0 -> l2@l1
| _  when i<=List.length l1 && i>0 -> [List.hd l1] @ [ins((List.tl l1), l2) (i-1)];;

ins ([1;2;3;4;5] , [6;7;8;9;10]) 3;;

该代码应该在第n个元素的第1个插入第二个列表

错误消息突出显示了这段代码

[ins((List.tl l1), l2) (i-1)];;
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^

Error: This expression has type 'a list
       but an expression was expected of type 'a
       The type variable 'a occurs inside 'a list

1 个答案:

答案 0 :(得分:1)

这些“发生”错误经常发生,但仍然非常令人困惑。从高层次上讲,这意味着您在同一上下文中使用列表的元素和列表。也就是说,类型系统推断出您的列表由自身组成,是一种Russel's Paradox

在实践上,这意味着在某个地方使用了表示列表的表达式,而在某个地方应该使用表示列表的元素的表达式(反之亦然)。

在您的情况下,ins((List.tl l1), l2) (i-1)表达式已经具有类型'a list,并且您将其放入附加列表[ins((List.tl l1), l2) (i-1)]中,使其变为'a = 'a list,这将触发发生错误。

希望,这足以使您修复代码。祝好运! :)