带有溢出整数的(!!)运算符



我最近刚刚开始学习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)

最新更新