在Haskell中获取列表的最后一个元素的最快方法

Dil*_*war 29 haskell list-comprehension

在Haskell中获取列表的最后一个元素的最快方法是什么.同样在下一次迭代中,我想删除列表的第一个和最后一个元素.最优雅的方式是什么?我正在尝试列表理解,但这看起来效率不高!

ick*_*fay 85

您可以使用last函数获取列表的最后一个元素.

至于如何删除第一个和最后一个元素,你可以使用(init . tail),但我不知道它有多高效.

我认为来自Learn You A Haskell的这张图片显示了列表功能:

列表功能的插图

  • @nulvinge (head . tail) 只会返回列表中的第二个元素。参见上图:) (4认同)

ham*_*mar 40

last并且init将做的工作就好了一次性的.但是它们都是O(n),所以如果你需要经常操作列表的两端,就像你似乎暗示的那样,你可能想要考虑使用Data.Sequence,它支持O(1)插入和删除两端的项目.


use*_*980 6

我将发布Prelude实现,因为它还没有发布:

listLast :: [a] -> a
listLast [x] = x --base case is when there's just one element remaining
listLast (_:xs) = listLast xs --if there's anything in the head, continue until there's one element left
listLast [] = error "Can't do last of an empty list!"
Run Code Online (Sandbox Code Playgroud)

请注意,我更改了函数名称,listLast以便它可以在不与正常Prelude冲突的情况下运行.当然,你可以做到import Prelude hiding(last).