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

时间:2014-01-28 23:32:16

标签: haskell

我刚刚开始学习Haskell并开始玩无限列表和懒惰评估的想法。我构建了一个无限列表,并尝试使用!!运算符访问非常非常远的索引处的元素。问题是!!运算符的类型签名如下:

(!!) :: [a] -> Int -> a

这意味着它需要Int作为索引才能从列表中检索该元素。

现在,每当我尝试将某些东西编入索引以至于它溢出Int并因此变为负数时,就会出现问题。什么是适当的Haskell方式呢?

2 个答案:

答案 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)