如何在没有@
运算符的情况下以艰难的方式实现此功能?
let rec append l i =
(* For example, if l is a list [1;2] and i is an integer 3
append [1;2] 3 = [1;2;3]*)
;;
答案 0 :(得分:13)
不使用现有的追加功能,甚至任何现有的功能, 只有模式匹配:
let rec insert_at_end l i =
match l with
[] -> [i]
| h :: t -> h :: (insert_at_end t i)
# insert_at_end [1;2] 3 ;;
- : int list = [1; 2; 3]
另请注意,OCaml的大多数标准库都是用OCaml编写的。通过阅读源包,您可以获得所需函数的源代码,或者在这种情况下,几乎可以获得所需的函数。在这种情况下:
file ocaml-3.11.1 / stdlib / pervasives.ml
(* List operations -- more in module List *)
let rec (@) l1 l2 =
match l1 with
[] -> l2
| hd :: tl -> hd :: (tl @ l2)
答案 1 :(得分:11)
简单的答案是:
let append l i = l @ [i]
List-append作为ocaml中的中缀函数@
提供,因此不需要自己滚动。它在默认的ocaml发行版中不是尾递归,但您可以使用extlib并使用以下命令开始源文件:
open Extlib
open ExtList
这提供了尾递归@
实现。您还可以使用batteries或Jane Street Core进行尾递归追加。
答案 2 :(得分:2)
这是一个尾递归实现,如果你想手工完成所有事情(并不是那么困难)。
首先,一个反转列表的函数:
let mirror l =
let rec aux accu = function
| [] -> accu
| h::t -> aux (h::accu) t
in aux [] l
使用辅助函数是常见的,以实现尾递归。
现在实际的“附加”功能:
let append l i = mirror (i::(mirror l))