我是Haskell的新手,正在尝试使用代数组来做一些事情。我的第一个功能就是执行一个操作和一个集合,并通过在同一对集合的成员上执行该操作来查找集合中的所有成员。这是我的代码如下:Haskell列表理解谓词顺序
group' f xs = [a | a <- xs, a <- combSet]
where combSet = [f x y | x <- xs, y <- xs]
然而,这个代码仅返回集combSet成员,无视a <- xs
断言:
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25,1,2,3,4,5,2,4,6,8,10,3,6,9,12,15,4,8,12,16,20,5,10,15,20,25]
但是当我切换的理解谓词的顺序,到
group' f xs = [a | a <- combSet, a <- xs]
where combSet = [f x y | x <- xs, y <- xs]
它返回正确的价值观,但名单是远远大于预期:
*Main> group' (*) [1, 2, 3, 4, 5]
[1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5]
谁能告诉我为什么发生这种情况,或者我做了一些愚蠢的事情?
啊,谢谢澄清。我来自数学背景,思维列表理解与集合定义相同。 – user2461616