我正在查看列表文档。图书馆好像没有提供sublist
功能。
我正在尝试从中获取元素列表i to j。现在我必须把它写成:
let rec sublist list i j =
if i > j then
[]
else
(List.nth list i) :: (sublist list (i+1) j)
这很简洁,但我质疑效率List.nth
,因为如果是O(n),我宁愿用不太简洁的方式来写它。
我想知道他们为什么不提供List.sublist
函数,如果List.nth
is not O(1),因为这是一个非常常见的操作..
let rec sublist b e l =
match l with
[] -> failwith "sublist"
| h :: t ->
let tail = if e=0 then [] else sublist (b-1) (e-1) t in
if b>0 then tail else h :: tail
;;
sublist 3 5 [1;2;3;4;5;6;7;8;9] ;;
- : int list = [4; 5; 6]
以上或多或少是 newacct 解决方案的砍伐版本。 newacct 的解决方案分配一个中间列表(drop i list
),编译器在 Haskell 中可以进行优化,但在 ML 中则困难得多。因此,他的版本非常适合 Haskell 函数,但对于 ML 函数来说稍显次优。两者之间的差别只是一个常数因子:都是 O(e)。 zrr 的版本是 O(length(l)) 因为List.filteri
不知道f
只返回false
一段时间后,它为所有元素调用它l
.
我不太乐意让b
变为负数,但不存在的版本更为复杂。
如果您有兴趣,可以参考很多有关森林砍伐的参考文献:http://homepages.inf.ed.ac.uk/wadler/topics/deforestation.html http://homepages.inf.ed.ac.uk/wadler/topics/deforestation.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)