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

标签 list haskell tuples list-comprehension

亲爱的社区,您好,

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

例如我得到了以下列表理解:

[ (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' ,作为倒数第二个 bool 值之间的权衡 True , False最后是数字。

不幸的是,我完全不知道如何实现这些,我想知道如何使用元组 [(a,b,c)] 操纵列表的序列.

最佳答案

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')]

(添加了新行以便于验证)

关于list - 在 Haskell 列表理解中组织元组序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46470375/

相关文章:

python - 在树递归期间保存路径

haskell - 这个haskell代码中的星号是什么意思?

haskell - 函数类型为 MonadReader

java - Java 类 java.util.ArrayList 的消息体编写器

c# - 如何在 C# 中制作一个 3 列的列表?

sorting - 按其在haskell中的元素之一对元组进行排序

scala - 为什么 productIterator 返回类型 Iterator[Any]?

python - 读取 CSV 文件并创建字典?

C:链表正确使用malloc

haskell - “+”不是类的可见方法