【发布时间】: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