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)
您需要采取的唯一额外步骤是通过以下方式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你的初始数据列表在哪里。
你所描述的是一种常见的Haskell模式!
它不一定是列表,
对于列表情况,此函数的类型将是
[a] -> (a -> [a]) -> [a]
Run Code Online (Sandbox Code Playgroud)
让我们叫的容器a的m 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 >>= f与concatMap f aWillem Van Onsem所建议的相同.