我最近刚刚开始学习Haskell,并开始尝试无限列表和懒惰评估的想法。我构造了一个无限列表,并尝试使用!!
运算符访问位于非常非常远的索引处的元素。问题是!!
运算符的类型签名如下:
(!!) :: [a] -> Int -> a
这意味着它使用Int
作为索引来从列表中检索该元素。
现在,每当我试图索引某个距离太远的东西,以至于它溢出Int
,从而变为负数时,就会出现我的问题。那么哈斯克尔做这件事的正确方式是什么呢?
Data.List.genericIndex支持使用任何整数进行索引,因此如果需要,可以使用Integer。
使用Integer
而不是Int
:自己实现!!
(!!!) :: [a] -> Integer -> a
xs !!! n | n < 0 = error "negative index"
[] !!! _ = error "index too large"
(x:_) !!! 0 = x
(_:xs) !!! n = xs !!! (pred n)