我刚刚开始学习Haskell并开始玩无限列表和懒惰评估的想法。我构建了一个无限列表,并尝试使用!!
运算符访问非常非常远的索引处的元素。问题是!!
运算符的类型签名如下:
(!!) :: [a] -> Int -> a
这意味着它需要Int
作为索引才能从列表中检索该元素。
现在,每当我尝试将某些东西编入索引以至于它溢出Int
并因此变为负数时,就会出现问题。什么是适当的Haskell方式呢?
答案 0 :(得分:8)
Data.List.genericIndex支持使用任何积分编号进行索引,因此您可以根据需要使用Integer。
答案 1 :(得分:1)
使用!!
代替Integer
实施Int
:
(!!!) :: [a] -> Integer -> a
xs !!! n | n < 0 = error "negative index"
[] !!! _ = error "index too large"
(x:_) !!! 0 = x
(_:xs) !!! n = xs !!! (pred n)