如何将元组列表转换为haskell中的常规列表?

时间:2017-10-30 16:29:14

标签: list haskell tuples

我想将元组(a,a)列表转换为a列表。这就是我到目前为止所拥有的

map (\(x,y) -> [x,y]) [(1,4),(2,5)] 
> [[1,4],[2,5]]

但我想要的是

> [1,4,2,5]

2 个答案:

答案 0 :(得分:5)

您所描述的是一种常见的Haskell模式!

  1. 列表
  2. 使用为每个元素生成列表的函数
  3. 加入单一列表。
  4. 它不一定是列表,

    1. 拿一个容器
    2. 使用为每个元素生成新容器的函数
    3. 加入容器。
    4. 对于列表情况,此函数的类型为

      [a] -> (a -> [a]) -> [a]
      

      让我们调用a的{​​{1}}容器,其中m a是容器类型。在这种情况下,我们会有

      m

      此功能为m a -> (a -> m a) -> m a !我们将它用作中缀运算符。

      >>=

      ...容器必须支持将两层“折叠”成一层。这是一个monad:)

      根据Willem Van Onsem的建议,

      Prelude> [(1,4),(2,5)] >>= \(x,y) -> [x,y] [1,4,2,5] a >>= f相同。

答案 1 :(得分:3)

您需要采取的唯一额外步骤是 concat创建列表,其中包含:

concat (map (\(x,y) -> [x,y]) [(1,4),(2,5)])

这里concat :: [[a]] -> [a]因此将列表列表连接成一个列表。

由于这种结构经常发生,因此有一种功能可以使它更方便:concatMap :: (a -> [b]) -> [a] -> [b]

concatMap (\(x,y) -> [x,y]) [(1,4),(2,5)]

您也可以使用list comprehension,并将其写成:

[z | (x,y) <- data, z <- [x,y]]

其中data是您的初始数据列表。

相关问题