在Haskell列表理解中组织元组序列

时间:2017-09-28 13:27:18

标签: list haskell tuples list-comprehension

Hello亲爱的社区,

我正在尝试在Haskell List理解中组织元组序列。

e.g。我得到了以下列表理解:

Sub PostExcel()
With ActiveSheet.QueryTables.Add(Connection:="URL;link", Destination:=Range("P2"))
.PostText = "sku=11111111&price=1111&key=1111111111111"
.RefreshStyle = xlOverwriteCells
.SaveData = True
.Refresh
End With

并获得:

[ (a,b,c,d) | a <- [0, 50, 100, 150, 200]
            , b <- ['a', 'b', 'c']
            , c <- [True, False]
            , d <- ['A', 'B']
            ]

现在我想要如下序列:

[ (0, 'a', True, 'A'), (0, 'a', True, 'B'), (0, 'a', False, 'A')
, (0, 'a', False, 'B'), (0, 'b', True, 'A'), (0, 'b', True, 'B')
, (0, 'b', False, 'A'), (0, 'b', False, 'B'), (0, 'c', True, 'A')
,(0, 'c', True, 'B'), (0, 'c', False, 'A')..

这意味着: 首先在大写字母[ (0, 'a', True, 'A'), (0, 'a', True, 'B'), (0, 'b', True, 'A') , (0, 'b', True, 'B'), (0, 'c' ,True, 'A'), (0, 'c', True, 'B') , (0, 'a', False, 'A'), (0, 'a', False, 'B').. 和大写字母之间进行权衡。 'A',然后在小写字母'B''a''b'之间进行权衡,作为倒数第二个布尔值'c'之间的权衡,{{ 1}}和最后的数字。

不幸的是,我完全不知道如何实现这些,我想知道如何使用元组True来操作列表的序列。

1 个答案:

答案 0 :(得分:6)

列表推导中x <- list语句的顺序非常重要。如果你写:

[expr | x <- list1, y <- list2]

这相当于嵌套的for循环,y是内循环。因此,与循环的Python等价物将是:

for x in list1:
    for y in list2:
        expr

因此在外环选择下一个值之前内环完全耗尽。

因此我们需要重新排序语句,以便首先选择d,然后选择b,然后选择c,最后选择a。这意味着我们转向:

[(a,b,c,d)| a <- [0,50..200], b <- "abc", c <- [True,False], d <-"AB"]

(我用符号缩短了名单)

成:

-- [(a,b,c,d)| a <- [0,50..200], b <- "abc", c <- [True,False], d <-"AB"]
--             |                  \_________/_____              |
--             |                   ________/      \             |
--             |                  /                \            |
   [(a,b,c,d)| a <- [0,50..200], c <- [True,False], b <- "abc", d <- "AB"]

(评论仅用于显示差异)

生成:

Prelude> [(a,b,c,d)| a <- [0,50..200], c <- [True,False], b <- "abc", d <- "AB"]
[(0,'a',True,'A'),
 (0,'a',True,'B'),
 (0,'b',True,'A'),
 (0,'b',True,'B'),
 (0,'c',True,'A'),
 (0,'c',True,'B'),
 (0,'a',False,'A'),
 (0,'a',False,'B'),
 (0,'b',False,'A'),
 (0,'b',False,'B'),
 (0,'c',False,'A'),
 (0,'c',False,'B'),
 (50,'a',True,'A'),
 (50,'a',True,'B'),
 (50,'b',True,'A'),
 (50,'b',True,'B'),
 (50,'c',True,'A'),
 (50,'c',True,'B'),
 (50,'a',False,'A'),
 (50,'a',False,'B'),
 (50,'b',False,'A'),
 (50,'b',False,'B'),
 (50,'c',False,'A'),
 (50,'c',False,'B'),
 (100,'a',True,'A'),
 (100,'a',True,'B'),
 (100,'b',True,'A'),
 (100,'b',True,'B'),
 (100,'c',True,'A'),
 (100,'c',True,'B'),
 (100,'a',False,'A'),
 (100,'a',False,'B'),
 (100,'b',False,'A'),
 (100,'b',False,'B'),
 (100,'c',False,'A'),
 (100,'c',False,'B'),
 (150,'a',True,'A'),
 (150,'a',True,'B'),
 (150,'b',True,'A'),
 (150,'b',True,'B'),
 (150,'c',True,'A'),
 (150,'c',True,'B'),
 (150,'a',False,'A'),
 (150,'a',False,'B'),
 (150,'b',False,'A'),
 (150,'b',False,'B'),
 (150,'c',False,'A'),
 (150,'c',False,'B'),
 (200,'a',True,'A'),
 (200,'a',True,'B'),
 (200,'b',True,'A'),
 (200,'b',True,'B'),
 (200,'c',True,'A'),
 (200,'c',True,'B'),
 (200,'a',False,'A'),
 (200,'a',False,'B'),
 (200,'b',False,'A'),
 (200,'b',False,'B'),
 (200,'c',False,'A'),
 (200,'c',False,'B')]

(添加新行以便于验证)