Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell列表长度备选方案_List_Haskell - Fatal编程技术网

List Haskell列表长度备选方案

List Haskell列表长度备选方案,list,haskell,List,Haskell,嗨,我有一个关于Haskell的列表,里面有将近10^15整数,我正在打印列表的长度 let list1 = [1..1000000000000000] -- this is just a dummy list I dont print list1 length -- know the actual number of elements 打印这需要很长的时间,是否有其他方法获取列表中元素的数量并打印该数量?我偶尔会从包含长度的列表中获取一些值。穷人的说

嗨,我有一个关于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的
。其他标准的
Prelude
函数在列表上运行,如
map
take
drop
,这些函数并不难模仿,不过你需要跳过那些像
cycle
repeat
这样的函数,它们会产生无限的列表,并且
filter
等等都有点昂贵。对于您的问题,您还需要类似的
Enum
方法;e、 g.可能类似于:

enumFromToLL :: Integral a => a -> a -> ListLength a
enumFromToLL lo hi = (fromIntegral hi-fromIntegral lo+1, [lo..hi])
然后,在ghci中,您的示例是即时:

> lengthLL (enumFromToLL 1 1000000000000000)
1000000000000000

我偶尔会从列表中得到一些有价值的东西。穷人的说法是这样的:

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
repeat
这样的函数,它们会产生无限的列表,并且
filter
等等都有点昂贵。对于您的问题,您还需要类似的
Enum
方法;e、 g.可能类似于:

enumFromToLL :: Integral a => a -> a -> ListLength a
enumFromToLL lo hi = (fromIntegral hi-fromIntegral lo+1, [lo..hi])
然后,在ghci中,您的示例是即时:

> lengthLL (enumFromToLL 1 1000000000000000)
1000000000000000

不,没有。你需要使用更智能的算法,这样你就不会真正使用列表,或者至少你不需要长度。不管怎样,这似乎是一个XY问题,我想你会从询问如何解决问题而不是如何实现你心中的解决方案中获益。Haskell列表只是链接列表。只有一堆cons单元格(使用
构造函数)和(可能)一个终端
[]
。如果不数一数,就无法知道有多少cons细胞。如果O(n)对于长度来说成本太高,并且您不想自己存储它,那么很可能您应该使用不同的数据结构。我同意@ReinHenrichs tho的观点,即您应该发布您试图使用列表长度来解决的问题,因为可能有一种更快的替代方法。@HenriMenke这是一个链表:如果不遍历整个列表,您就无法获得
最后一个列表1
。您可能有一个函数,您希望生成那么多
Int
s,但我很怀疑你有这么多
Int
s的实际清单。这样的列表至少需要4 PB的内存。不,没有。你需要使用更智能的算法,这样你就不会真正使用列表,或者至少你不需要长度。不管怎样,这似乎是一个XY问题,我想你会从询问如何解决问题而不是如何实现你心中的解决方案中获益。Haskell列表只是链接列表。只有一堆cons单元格(使用
构造函数)和(可能)一个终端
[]
。如果不数一数,就无法知道有多少cons细胞。如果O(n)对于长度来说成本太高,并且您不想自己存储它,那么很可能您应该使用不同的数据结构。我同意@ReinHenrichs tho的观点,即您应该发布您试图使用列表长度来解决的问题,因为可能有一种更快的替代方法。@HenriMenke这是一个链表:如果不遍历整个列表,您就无法获得
最后一个列表1
。您可能有一个函数,您希望生成那么多
Int
s,但我很怀疑你有这么多
Int
s的实际清单。这样的列表至少需要4 PB的内存。