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

Dav*_*ett 1 haskell tuples list

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

map (\(x,y) -> [x,y]) [(1,4),(2,5)] 
> [[1,4],[2,5]]
Run Code Online (Sandbox Code Playgroud)

但我想要的是

> [1,4,2,5]
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 5

您需要采取的唯一额外步骤是通过以下方式concat启用列表

concat (map (\(x,y) -> [x,y]) [(1,4),(2,5)])
Run Code Online (Sandbox Code Playgroud)

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

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

concatMap (\(x,y) -> [x,y]) [(1,4),(2,5)]
Run Code Online (Sandbox Code Playgroud)

您还可以使用列表理解,并将其写为:

[z | (x,y) <- items, z <- [x,y]]
Run Code Online (Sandbox Code Playgroud)

data你的初始数据列表在哪里。


Teo*_*dor 5

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

  1. 拿一份清单
  2. 使用为每个元素生成列表的函数
  3. 加入单个列表.

它不一定是列表,

  1. 拿一个容器
  2. 使用为每个元素生成新容器的函数
  3. 加入容器.

对于列表情况,此函数的类型将是

[a] -> (a -> [a]) -> [a]
Run Code Online (Sandbox Code Playgroud)

让我们叫的容器am a,这里m是容器类型.在这种情况下,我们会

m a -> (a -> m a) -> m a
Run Code Online (Sandbox Code Playgroud)

这个功能是>>=!我们将它用作中缀运算符.

Prelude> [(1,4),(2,5)] >>= \(x,y) -> [x,y]
[1,4,2,5]
Run Code Online (Sandbox Code Playgroud)

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

a >>= fconcatMap f aWillem Van Onsem所建议的相同.

  • 根据[Learn you a Haskell](http://www.learnyouahaskell.com/a-fistful-of-monads),`>> =`通常发音为_bind_.我倾向于认为它是_stuff into_-operator. (2认同)