我在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 类型变量' a出现在列表
中
如何指定这些是我尝试通过的列表,而不是' a?
答案 0 :(得分:2)
首先,这个功能不起作用。如果两个列表都是空的,你合并尾部并连接每个列表的头部,但是......好吧......它们都是空的......
无论如何,您的问题是您正在使用类型为::
的{{1}}运算符(串联),因此左侧成员应为元素,右侧成员为列表,此处为左边一个是列表,右边一个是元素,所以它无法工作。
关于您的问题,由于推断出类型,您无法告诉编译器您是对的,而且他是错的,在这种情况下错误是真的明确:
'a -> 'a list -> 'a list
将始终返回错误,因为您有一个无限类型(因为 List.tl l (* 'a list *) :: List.hd l (* 'a *)
类型为::
,我让您尝试确定可以与您的串联匹配的有限类型'a -> 'a list -> 'a list
)
所以,我想你想做的是这样的事情:
'a