簡體   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