Haskell将元组列表变成列表列表

时间:2019-04-06 21:26:42

标签: haskell functional-programming lazy-evaluation

我正在尝试将元组列表变成列表列表。例如,如果我有列表[(9,1), (6,3), (4,1)],那么它将变成[[9, 6, 4],[6],[6]]。发生的是,在元组列表[(a,b)]中,a代表一个0-9之间的数字,而b代表该数字的出现,a将始终是唯一的。

我要进行的操作遍历列表n次,其中n = maximum b in the list of tuples.每次遍历该列表时,我都会将a放入列表中,然后将b减1。如果b == 0那么我就跳过它。

因此,在我的示例中,我将[9,6,4]放入列表中,然后递减每个列表中的b,现在列表看起来像[(9,0),(6,2),(4,0)]。然后再看一遍,我取[6],元组列表现在看起来像[(9,0), (6,1), (4,0)]。最后,最后一次使用[6],现在元组列表中的b就是0,就可以了。

我创建了一个从元组列表中获取第一个元素的函数iff b> = 1,但是我不知道如何使用所有`b-1来遍历更新后的列表每个元组。

turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = []
turnIntList x = ([map (\(a, b) -> case (a,b) of  _ | b >= 1 -> a | otherwise -> -1) x])

我还尝试创建另一个帮助程序函数,该函数接受元组列表,并根据b的大小将其转换为列表。从主函数开始,我将尝试发送[(a,1),(b,1)...]以创建列表,然后在此处跟踪递减b直到完成。因此,对于此功能:

pairingL :: [(Integer, Integer)] -> [Integer] -> [Integer]
pairingL ((a,b):xs) l -- = if b /= 0 then [a,b-1] else []
    | null xs = if b == 1 then [a] ++ l else if b > 1 then [a] ++ l ++ pairingL [(a,b-1)] l else l
    | otherwise = 
        if b /= 0 then [a] ++ l ++ pairingL ((a,b-1):xs) l else pairingL xs l


pairingL [(9,1), (7,2), (5,1)]
[9,7,7,5]

pairingL [(1,1), (2,1), (3,1)]
[1,2,3]

pairingL [(1,2), (2,2), (3,2)]
[1,1,2,2,3,3]

我曾尝试寻找解压缩列表并对其进行处理,迭代和重复的过程,但我不知道如何使函数多次遍历列表并使用新的{{1 }}值,然后再去一次。

总而言之,我想做的事情是这样的:

b

过程: 我从元组中提取第一个元素,将它们添加到列表中,然后将第二个元素减去1。对列表中的每个元组执行此操作之后,我重复此过程,直到每个元组的所有第二个元素都为0

重要说明:同样,在元组[(a,b)]的列表中, turnIntList [(9,3),(5,1),(2,1)] [[9,5,2],[9],[9]] turnIntList [(1,1),(2,1),(3,1),(4,1)] [[1,2,3,4]] turnIntList [(1,2),(2,2),(3,2)] [[1,2,3],[1,2,3]] turnIntList [(4,2),(6,1)] [[4,6],[4]] 始终是0到9之间的唯一数字,而a

1 个答案:

答案 0 :(得分:2)

也许

turnIntList :: [(Integer, Integer)] -> [[Integer]]
turnIntList [] = [] -- if it doesn’t compile use [[]]
turnIntList ls = [i | (i, _) <- ls] : turnIntList [(i, n - 1) | (i, n) <- ls, n - 1 > 0]