我想将元组(a,a)
列表转换为a
列表。这就是我到目前为止所拥有的
map (\(x,y) -> [x,y]) [(1,4),(2,5)]
> [[1,4],[2,5]]
但我想要的是
> [1,4,2,5]
答案 0 :(得分:5)
您所描述的是一种常见的Haskell模式!
它不一定是列表,
对于列表情况,此函数的类型为
[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
是您的初始数据列表。