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
来操作列表的序列。
答案 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')]
(添加新行以便于验证)