如何在haskell中展平列表列表

Bil*_*nde 6 haskell flatten

我想做的只是我要问的.函数的类型签名应该是这样的:

flatten::[[[Int]]] -> [[Int]]
Run Code Online (Sandbox Code Playgroud)

我试图搜索一些扁平的代码,但他们定义了新的类型,这让我感到困惑.有帮助吗?提前致谢.

chi*_*chi 18

有(至少)两种写法

flatten::[[[Int]]] -> [[Int]]
Run Code Online (Sandbox Code Playgroud)

一个是

flatten1 = concat
-- Example: flatten [[[1], [2]], [[3]]] = [[1], [2], [3]] :: [[Int]]
Run Code Online (Sandbox Code Playgroud)

另一个是

flatten2 = map concat
-- Example: flatten [[[1], [2]], [[3]]] = [[1,2], [3]] :: [[Int]]
Run Code Online (Sandbox Code Playgroud)

基本上,flatten1扁平括号的"中间"水平,同时使括号flatten2的"最里面"水平变平.

作为练习,您可能想要说服自己

concat . flatten1 = concat . flatten2 :: [[[Int]]] -> [Int]
Run Code Online (Sandbox Code Playgroud)

实际上,两者都会产生[1,2,3]上述例子.

更高级的评论

上面的法律实际上是一个非常着名的法律,因为它是monad法律的一个特例

join . fmap join = join . join :: Monad m => m (m (m a)) -> m a
Run Code Online (Sandbox Code Playgroud)

where m = [](即列表monad),和a=Int


dup*_*ode 11

你在找

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

在您的用例中,元素类型恰好是[Int].