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

Mar*_*cel 2 haskell functional-programming list-comprehension

我正在学习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]
Run Code Online (Sandbox Code Playgroud)

那么为什么不说:

 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]
Run Code Online (Sandbox Code Playgroud)

我希望元素的排序方式与我的第一个例子完全相同.我想要所有元素,其中c = a + b,然后是所有元素,其中c = ab.

请注意,在我的第二个代码中,订单不是我想要的.我似乎无法弄清楚我是如何在列表理解中命令的,特别是当我有元组时...

谢谢!

chi*_*chi 6

(+),(-)在第一个生成器中选择功能.

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

顺便说一下,这是一种低效的方法.c <- ys我们不应该尝试每一个,而应该let c = f a b检查是否-100 <= c && c <= 100(和均匀度).以这种方式,我们使代码快200倍.

  • @Marcel当然,即使你不能使用一个函数,你仍然可以用普通数据达到同样的效果; 例如`[(a,b,c)| useAddition < - [False,True],...,c ==如果useAddition则a + b else a - b]`.这里真正的见解是将你想要变化的东西作为第一个生成器变得最慢. (2认同)
  • @jaroslawj看起来没有测量,只是估计:对于f,a和b的每个组合,它减少了200次均匀度检查和比较. (2认同)