【问题标题】:General merge of two lists两个列表的一般合并
【发布时间】:2013-01-29 00:33:45
【问题描述】:

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

编写一个通用函数合并,它接受一个比较函数作为参数 和两个按此顺序排序的列表,并返回按相同顺序合并的列表。 比较函数的类型为 '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

【问题讨论】:

    标签: list merge functional-programming ocaml ml


    【解决方案1】:

    显然,merge2 接受 3 个参数,但您在递归调用中只提供了 2 个参数。 else 分支中也有几个拼写错误(merge2 应该是 headBmerge 应该是 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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-03
      • 2014-01-27
      • 2014-01-03
      • 1970-01-01
      • 2014-04-01
      • 1970-01-01
      相关资源
      最近更新 更多