首页 > 解决方案 > 如何将具有两个生成器的列表推导重新表达为两个具有一个生成器的列表推导并获得相同的结果?

问题描述

我正在尝试学习 Haskell,并且正在做一些涉及列表的练习。但是我正在努力进行有关列表理解的练习,我真的需要有人来帮助我。练习内容如下:

展示如何[(x,y) | x <- [1,2], y <- [3,4]]使用具有单个生成器的两个推导式重新表达具有两个生成器的列表推导式。

提示:将一个理解嵌套在另一个理解中并使用库函数concat :: [[a]] -> [a]

我感谢所有的答案和解释。谢谢。

标签: haskellfunctional-programminglist-comprehension

解决方案


首先,您可以[1, 2]使用[x | x <- [1, 2]].

现在,对于每个x,您都希望拥有(x, 3)and(x, 4)而不是仅仅x. 所以让我们用列表推导替换它。然后你会得到[[(x, y) | y <- [3, 4]] | x <- [1, 2]].

但这给了您,[[(1,3),(1,4)],[(2,3),(2,4)]]因为您将每个转换x[(x, 3), (x, 4)]. 正如提示所暗示的,你可以用它concat来压扁它们。

把它放在一起,你会得到concat [[(x, y) | y <- [3, 4]] | x <- [1, 2]].


推荐阅读