[英]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.