您好我在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
打印这需要很长时间才能完成,是否有其他方法可以获取列表中的元素数量并打印该数字?
答案 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
等。对Prelude
,map
,take
等列表进行操作的其他标准drop
函数并不难模仿,但您需要跳过像{{cycle
这样的函数。产生无限列表的1}}和repeat
,filter
等等都有点贵。对于您的问题,您还需要Enum
方法的类比;例如也许是这样的:
enumFromToLL :: Integral a => a -> a -> ListLength a
enumFromToLL lo hi = (fromIntegral hi-fromIntegral lo+1, [lo..hi])
然后,在ghci中,你的例子是即时的:
> lengthLL (enumFromToLL 1 1000000000000000)
1000000000000000