Haskell列表长度替代

时间:2018-04-12 01:23:44

标签: list haskell

您好我在Haskell上有一个列表,其中有近10 ^ 15个Int并且我正在尝试打印列表的长度。

let list1 = [1..1000000000000000]   --  this is just a dummy list I dont
print list1 length                  --  know the actual number of elements

打印这需要很长时间才能完成,是否有其他方法可以获取列表中的元素数量并打印该数字?

1 个答案:

答案 0 :(得分:2)

我偶尔会从带有长度的列表中获得一些价值。穷人的版本是这样的:

import Data.Monoid

type ListLength a = (Sum Integer, [a])

singletonLL :: a -> ListLength a
singletonLL x = (1, [x])

lengthLL :: ListLength a -> Integer
lengthLL (Sum len, _) = len

免费提供的Monoid实例为您提供空列表,连接和fromList等。对Preludemaptake等列表进行操作的其他标准drop函数并不难模仿,但您需要跳过像{{cycle这样的函数。产生无限列表的1}}和repeatfilter等等都有点贵。对于您的问题,您还需要Enum方法的类比;例如也许是这样的:

enumFromToLL :: Integral a => a -> a -> ListLength a
enumFromToLL lo hi = (fromIntegral hi-fromIntegral lo+1, [lo..hi])

然后,在ghci中,你的例子是即时的:

> lengthLL (enumFromToLL 1 1000000000000000)
1000000000000000