我开始学习OCaml,我遇到了一个简单功能的问题。这来自Developing Application with Objective OCaml
编写一个通用函数merge,它将比较函数作为参数 和两个按此顺序排序的列表,并返回以相同顺序合并的列表。 比较函数的类型为'a - > 'a - >布尔。
这是我到目前为止所得到的
(* func : 'a -> 'a -> bool) *)
let rec merge2 listA listB func = match listA, listB with
| list, [] | [], list -> list
| (headA :: tailA), (headB :: tailB) ->
if (func headA headB) then headA :: merge2 tailA listB
else merge2 :: merge listA tailB
,这是一条错误消息
Characters 169-187:
if (func headA headB) then headA :: merge2 tailA listB
^^^^^^^^^^^^^^^^^^
Error: This expression has type ('a -> 'a -> bool) -> 'a list
but an expression was expected of type 'a list
我不明白我收到此错误消息。显然是虚函数
let foo a b f = if (f a b ) then true else false
工作得很好。我还尝试明确说明类型。
编辑:
更正代码
let rec merge2 listA listB func = match listA, listB with
| list, [] | [], list -> list
| (headA :: tailA), (headB :: tailB) ->
if (func headA headB) then headA :: merge2 tailA listB func
else headB :: merge2 listA tailB func
答案 0 :(得分:2)
显然,merge2
需要3个参数,但在递归调用中只提供了2个参数。 else
分支中也存在多个拼写错误(merge2
应为headB
,而merge
应成为merge2
。)
为避免此类错误,最好先预先更改频繁更改的参数:
let rec merge2 f xs ys =
match xs, ys with
| zs, [] | [], zs -> zs
| x::xs', y::ys' ->
if f x y then x::merge2 f xs' ys
else y::merge2 f xs ys'