[英]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
函数(例如map
, take
, drop
并不是很难模仿,尽管您将需要跳过诸如cycle
并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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.