使用位置返回列表元素

时间:2014-03-07 16:19:21

标签: list haskell position

我最近开始学习Haskell,在最初的一课中,我被告知要先学习如何操作列表。我理解如何从它的位置选择一个列表元素

    myList = [7, 3, 6, 15, 8]
    myList !! 3

现在,我想知道是否可以从列表的最后一个元素开始选择一个位置,就像我在Python中使用这个位置一样

    pythonlist = [7, 3, 6, 15, 8]
    pythonlist[-2]

3 个答案:

答案 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..],它永远不会终止!问题是你无法从无限列表的末尾开始索引。