【发布时间】:2013-06-19 14:59:08
【问题描述】:
要获取列表xs 的最后一个n 元素,我可以使用reverse (take n (reverse xs)),但这不是很好的代码(它在返回任何内容之前将完整列表保留在内存中,并且结果不共享与原始列表)。
如何在 Haskell 中实现 lastR 函数?
【问题讨论】:
-
从未尝试过 Haskell 但知道 OCaml 并且有一句话让我印象深刻:如何与原始列表共享结果? Haskell 中的对象不是不可变的吗? (与大多数函数式语言一样)
-
@Boris 是的。但是当您执行
drop 1 xs之类的操作时,会从列表中删除第一个元素。 Haskell 通常不会创建一个少 1 个元素的新列表,而是通过将指针更改为指向原始列表的第二个元素来优化这一点。 -
感谢您的澄清。事实上,我一定是累了 ;-) 确实,它 - 因为 - 我猜你可以做这个优化是不可变的:共享地址仍然是安全的,并且保留了按值复制的语义,因为你知道对象无论如何都不会改变。如果我错了,请纠正我,多年来没有玩过这些东西。
-
tailn n xs = drop (length xs - n) xs ---- 把你不想要的从列表的前面拿走,留下你想要的,列表的其余部分.
-
好奇:
\n xs -> [x | [x] <- transpose [drop n xs, xs]]。分享:(\n xs -> foldr (\_ r (_:z) -> r z) id (drop n xs) xs)(与 Davorak 的foldl'解决方案相同)