Haskell中列表理解的评价

Haskell中列表理解的评价,haskell,list-comprehension,Haskell,List Comprehension,我想知道在Haskell中列表理解是如何评估的。在读了这个和这个之后:我还是不太明白 [<function> x|x <- <someList>, <somePredicate>] [x | x一个特定的无限序列没有更多与谓词匹配的元素这一事实并不明显。当您将列表传递给过滤器时,除了元素可以传递给谓词之外,它无法知道元素的任何其他属性 您可以编写自己版本的Ord a=>List a,它可以将序列描述为升序或非升序,也可以编写一个版本的filter,它可

我想知道在Haskell中列表理解是如何评估的。在读了这个和这个之后:我还是不太明白

[<function> x|x <- <someList>, <somePredicate>]

[x | x一个特定的无限序列没有更多与谓词匹配的元素这一事实并不明显。当您将列表传递给
过滤器
时,除了元素可以传递给谓词之外,它无法知道元素的任何其他属性

您可以编写自己版本的
Ord a=>List a
,它可以将序列描述为升序或非升序,也可以编写一个版本的
filter
,它可以使用此信息停止查看超过特定阈值的元素。不幸的是,列表理解不会使用其中任何一个


相反,我将使用
takeWhile
和不带谓词的理解/plain
map
的组合。在
takeWhile
参数中的某个地方,您将向编译器提供有关预期上限的信息;对于n个十进制数字,它将是10^n。

关于f的信息并不明显假设一个特定的无限序列没有更多与谓词匹配的元素。当您将列表传递给
过滤器
时,除了元素可以传递给谓词之外,它无法知道元素的任何其他属性

您可以编写自己版本的
Ord a=>List a
,它可以将序列描述为升序或非升序,也可以编写一个版本的
filter
,它可以使用此信息停止查看超过特定阈值的元素。不幸的是,列表理解不会使用其中任何一个


相反,我将使用
takeWhile
和不带谓词的理解/plain
map
的组合。在
takeWhile
参数中的某个地方,您将向编译器提供有关预期上限的信息;对于n个十进制数字,它将是10^n。

[x | x
[x | x对
[x | x@Lee:我想你可以从
[x | x]中提取多达19个元素,我的意思是过滤器(p)。映射(f)$list和[fx | x列表理解为一元代码(使用
保护
函数),而不是由
过滤器
映射
@epsilonhalbe:我认为
过滤器组成(
应该给出长度finiteNumber的列表,但我现在知道它不会给出。谢谢大家。
[x|x@Lee]的评估:我想你们可以从
[x|x]中提取多达19个元素,我的意思是过滤器(p)。映射(f)$list和[fx|x]列表理解为一元代码(使用
guard
函数),而不是
filter
map
@epsilonhalbe的组合:我认为
filter(
应该给出一个长度finiteNumber的列表,但我现在明白了,它不会。谢谢你们。这基本上意味着列表理解会把你们搞砸…非常感谢你们的快速回答。我没有一个具体的问题,我正在尝试优化,但由于我是Haskell的新手,我试图更好地理解compiler能帮你什么忙。@Chris:需要小心处理的不是理解,而是无限序列;任何其他语言中的无限循环也需要额外的注意。所以这基本上意味着列表理解真的会把你搞糟……非常感谢你的快速回答。我没有具体的问题,我正在尝试为了优化,但由于我是Haskell的新手,我试图更好地理解编译器将为您做什么,不做什么。@Chris:需要小心处理的不是理解,而是无限序列;任何其他语言中的无限循环也需要额外的注意。
filter (<somePredicate>) . map (<function>) $ <someList>
[x|x <- [1..], x < 20]
[x|x <- [1..], (sum.map factorial $ digits x) == x]
[<function> x|x <- <someList>, <somePredicate>]
filter (<somePredicate>) . map (<function>) $ <someList>