如何解决如何在 OCaml 中实现 Array.to_list 和 Array.of_list
我想知道 Array 模块的 to_list 和 of_list 函数的实现。
解决方法
OCaml Stdlib
代码可读性很强,你可以在 stdlib/array.ml
中自行检查。
在这里,供参考:
let rec list_length accu = function
| [] -> accu
| _::t -> list_length (succ accu) t
let to_list a =
let rec tolist i res =
if i < 0 then res
else tolist (i - 1) (unsafe_get a i :: res)
in
tolist (length a - 1) []
let of_list = function
[] -> [||]
| hd::tl as l ->
let a = create (list_length 0 l) hd in
let rec fill i = function
[] -> a
| hd::tl -> unsafe_set a i hd; fill (i+1) tl
in
fill 1 tl
注意事项:
unsafe_get
、unsafe_set
、length
和 create
在外部定义(不在 OCaml 中)。
Array
模块有自己的 List.length
版本以避免循环依赖。
如果您想了解这些函数在标准库中是如何实现的,欢迎您阅读实现的source code,因为它是最好的参考。
如果您想知道如何使用标准库函数来实现这些函数(即,不依赖内部表示,只有标准库的实现者知道),那么这里是这些函数的可能实现,
let array_to_list xs =
Array.fold_right List.cons xs []
let array_of_list xs = match xs with
| [] -> [||]
| default :: _ ->
let arr = Array.make (List.length xs) default in
List.iteri (Array.set arr) xs;
arr
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。