如何解决从列表列表中删除所有空列表 Ocaml
请帮忙。 我正在尝试在 OCaml 中编写两个非递归函数(列表列表包含本身就是列表的元素)
-
clear l
它将列表列表作为参数,并返回没有空列表的列表列表(如果有的话)。 示例:clear [[2];[];[];[3;4;6];[6;5];[]]
会回来[[2];[3;4;6];[6;5]]
-
sort_length l
根据长度对列表l
的元素进行排序。例如。sort_length [[2];[];[3];[6;5]]
返回[[];[2];[3];[6;5]]
我只被允许使用这些预定义的函数:List.filter、List.sort、List.hd、List.tl、List.length,其他没有。 谢谢
对于第二个函数,到目前为止我已经尝试过了,但是我使用了不允许的 map
let rec insert cmp e = function
| [] -> [e]
| h :: t as l -> if cmp e h <= 0 then e :: l else h :: insert cmp e t
let rec sort cmp = function
| [] -> []
| h :: t -> insert cmp h (sort cmp t)
let sort_length l =
let l = List.map (fun list -> List.length list,list) l in
let l = sort (fun a b -> compare (fst a) (fst b)) l in
List.map snd l;;
谢谢
解决方法
正如这里提到的:https://ocaml.org/api/List.html#VALfilter,List.filter
返回列表中满足给定谓词的所有元素。所以你必须写一个谓词来描述一个非空的列表。表示列表不为空的另一种方式是说“其大小大于零”。所以可以用这种方式来表述 clear
:
let clear list =
let is_not_empty l = (List.length l) > 0 in
List.filter is_not_empty list
小修改
正如 Chris Dutton 所提到的,使用 List.length
可能效率低下。另一种方法是以这种方式表达is_not_empty
:
let is_not_empty = function
| [] -> false
| _ -> true
这种方法“更好”,因为它不需要遍历整个列表来查看它是否为空。
对于第二点,List.sort
函数采用两个元素 ('a -> 'a -> int
) 之间的比较函数,这里的比较必须作用于列表的大小。
换句话说,必须比较观察到的两个列表的大小。一种方法是对两个观察到的列表的大小使用 Int.compare
(https://ocaml.org/api/Int.html#VALcompare)。例如:
let sort_length list =
let compare_length a b =
let la = List.length a in
let lb = List.length b in
Int.compare la lb
in
List.sort compare_length list
这两个函数有更简洁的写法,但这些实现应该相当清晰。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。