0

我开始学习 OCaml,但我遇到了一个简单函数的问题。这是从Developing Application with Objective OCaml

编写一个通用函数 merge,它以一个比较函数和两个按此顺序排序的列表作为参数,并返回按相同顺序合并的列表。比较函数的类型为 'a -> 'a -> bool。

这是我到目前为止得到的

(* 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
4

1 回答 1

2

显然,merge2需要 3 个参数,但您在递归调用中只提供了 2 个参数。else分支中也有几个错别字(merge2应该是headBwhilemerge应该成为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'
于 2013-01-28T16:11:27.683 回答