我最近开始学习Haskell,在最初的一课中,我被告知要先学习如何操作列表。我理解如何从它的位置选择一个列表元素
myList = [7, 3, 6, 15, 8]
myList !! 3
现在,我想知道是否可以从列表的最后一个元素开始选择一个位置,就像我在Python中使用这个位置一样
pythonlist = [7, 3, 6, 15, 8]
pythonlist[-2]
答案 0 :(得分:1)
首先,如果你发现你自己按索引访问列表(你不应该经常这样做,它是低效和丑陋的:更喜欢折叠,map
和monad实例等功能工具)那么你应该更好地切换到某种数组数据类型,例如Vector
但确定可能可以通过索引访问列表,也可以从后面访问:
(!!<) :: [a] -> Int -> a
l !!< i = l !! i'
where i' = length l - i - 1
我希望这很有效。它比普通访问效率更低,因为length
遍历整个列表,但你就是。
答案 1 :(得分:1)
你可以这样做:
(!!<) :: [a] -> Int -> a
l !!< i = (reverse l) !! i
但这意味着你不能使用负数,只能使用正数,但它会从列表末尾看。
或者如果你真的想使用底片:
(!!<) :: [a] -> Int -> a
l !!< i = if i < 0 then l !! (length l + i) else l !! i
答案 2 :(得分:0)
在某些情况下,是的。您只需将(!!)
重新定义为:
xs !! i | i >= 0 = xs Data.List.!! i
| i < 0 = let n = length xs
in xs Data.List.!! (n+i)
然而,由于 laziness ,这在Haskell中并不是一个好主意。上面的解决方案适用于有限列表,这是您在Python中所讨论的内容。但请考虑无限列表中发生的事情:[1..] !! (-2)
。我们首先评估length [1..]
,它永远不会终止!问题是你无法从无限列表的末尾开始索引。