Optimization 如何优化此列表?

Optimization 如何优化此列表?,optimization,haskell,profiling,Optimization,Haskell,Profiling,我想从一个列表中生成所有可能的对,限制为(a,b)=(b,a)和((a,b),(c,d))==(c,d),(a,b))对于所有a,b,c,d。此外,我可以假设我作为参数提供的列表中的所有元素都是不同的 我做的第一件事就是写下这个清单: pairsOfPairs :: [a] -> [((a,a),(a,a))] pairsOfPairs xs = [((w,x),(y,z)) | w <- xs, x <- xs, y <- xs, z <- xs,

我想从一个列表中生成所有可能的对,限制为(a,b)=(b,a)和((a,b),(c,d))==(c,d),(a,b))对于所有a,b,c,d。此外,我可以假设我作为参数提供的列表中的所有元素都是不同的

我做的第一件事就是写下这个清单:

pairsOfPairs :: [a] -> [((a,a),(a,a))]
pairsOfPairs xs = [((w,x),(y,z)) | w <- xs, x <- xs, y <- xs, z <- xs,
                      w < x, y < z, w < y, w /= z, x /= y, x /= z]
pairsOfPairs::[a]->[((a,a),(a,a))]

pairsOfPairs xs=[((w,x),(y,z))| w减少工作量的简单方法是尽早过滤

pairsOfPairs :: Ord a => [a] -> [((a,a),(a,a))]
pairsOfPairs xs = [((w,x),(y,z)) | w <- xs, x <- xs, w < x, y <- xs, w < y, x /= y, 
                                   z <- xs, y < z, w /= z, x /= z]

列表理解中绑定和过滤器的简单重新排序带来了巨大的速度差异-非常感谢!出于好奇,GHC不能优化它本身有什么原因吗?是因为列表理解是do符号的糖分,do块是必需的吗?您可能还喜欢以下实现:
pairs xs=[(x,y)| x:ys很好,@Daniel,我喜欢。@Chris do块是
(>>=)
(>>)的语法糖
chains,它们本身并不是命令式的。它们看起来似乎是命令式的,有时这会使代码更清晰,有时则不然。GHC无法自行进行这种转换的唯一原因是因为它没有实现。我倾向于认为它没有实现,因为很难验证重新排序是否不会改变语义并提高性能性能,而且GHC黑客根本就不够多,所以到目前为止没有人有时间这么做。你的第一段似乎暗示a=b=c=d。我不认为这是你的意思。@dave4420我用“==”来表示等价,也就是说,这对(a,b)应该算作等价于这对(b,a),但不是说a和b必须相等。
ordPairs :: [a] -> [(a,a)]
ordPairs (x:xs) = [(x,y) | y <- xs] ++ ordPairs xs
ordPairs [] = []