Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 两个列表的一般合并_List_Merge_Functional Programming_Ocaml_Ml - Fatal编程技术网

List 两个列表的一般合并

List 两个列表的一般合并,list,merge,functional-programming,ocaml,ml,List,Merge,Functional Programming,Ocaml,Ml,我开始学习OCaml,我对一个简单的函数有一个问题。这来自于使用目标OCaml开发应用程序 编写一个通用函数merge,它以比较函数作为参数 和按此顺序排序的两个列表,并返回按相同顺序合并的列表。 比较函数的类型为“a->”a->bool 这是我到目前为止得到的 (* func : 'a -> 'a -> bool) *) let rec merge2 listA listB func = match listA, listB with | list, [] | [], li

我开始学习OCaml,我对一个简单的函数有一个问题。这来自于使用目标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
我不明白为什么我会收到这个错误信息。显然是一个伪函数

设foo a b f=if(f a b),则为true,否则为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

显然,
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'