繁体   English   中英

Haskell列表长度替代

[英]Haskell list length alternative

嗨,我在Haskell上有一个列表,其中包含接近10 ^ 15的整数,我正在尝试打印列表的长度。

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

打印此文件需要花费很长时间,是否还有另一种方法来获取列表中的元素数量并打印该数量?

从偶尔列出的清单中我有时会得到一些价值。 可怜的人的版本是这样的:

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相似。 在列表map运行的其他标准Prelude函数(例如maptakedrop并不是很难模仿,尽管您将需要跳过诸如cyclerepeat生成无限列表的那些函数,而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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM