繁体   English   中英

Haskell列表理解顺序元素/元组

[英]Haskell List Comprehension order elements/tuples

我目前正在学习Haskell,并且是FP的绝对入门者。

现在,我正在尝试使用列表理解功能。

 listComprehension  = [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a+b] ++
                      [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a-b]
                      where xs = [1..4]; ys = [(-100)..100]

那么为什么不说:

 listComprehension  = [(a,b,c) | a <- xs, b <- xs, c <- ys, even c, c == a+b || c == a-b]
                      where xs = [1..4]; ys = [(-100)..100]

我希望元素的排序与第一个示例完全相同。 我想要c = a + b的所有元素,然后c = ab的所有元素。

请注意,在我的第二个代码中,顺序不是我想要的。 我似乎无法弄清楚如何以列表理解的方式排序事物,特别是当我有元组时。

谢谢!

在第一个生成器的功能(+),(-)之间选择。

listComprehension =
   [(a,b,c) | f <- [(+),(-)], a <- xs, b <- xs, c <- ys, even c, c == f a b ]
   where xs = [1..4]; ys = [(-100)..100]

顺便说一句,这是一种低效的方法。 而不是尝试每个c <- ys ,我们应该let c = fab ,然后检查-100 <= c && c <= 100 (和均匀性)。 这样,我们可使代码快200倍左右。

我以前在列表推导中使用过替代功能([even,odd])。 我并不总是对他们的效率最高感到满意。 我看到的缺点是,它们将通过源列表两次或更多次。 为此,我选择了一种不同的方法,但是,对于较小的数据集,效率并不是很多考虑因素。

这就是我写的

lc xs ys = [[(a,b,c)|(a,b,c)<-ls,c==a+b] ++ [(a,b,c)|(a,b,c)<-ls,c==a-b]]
           where ls = [(a,b,c)| a<-xs, b<-xs, c<-ys, even c]

这比原始功能要快,也比其他答案要快。 更为引人注目的是它使用的内存比任何一个都要少。

从长列表中选择值是一回事,而仅从生成的值中设置它们是另一回事。

lc xs = [(a,b,c)|a<-xs,b<-xs,c<-[(a-b),(a+b)],even c]
partition (\(a,b,c) -> c == a+b) lc [1..4]

暂无
暂无

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

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