如何在haskell中展平列表列表

时间:2014-03-17 16:02:58

标签: haskell flatten

我想做的就是我要求的。函数的类型签名应为:

flatten::[[[Int]]] -> [[Int]]

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

3 个答案:

答案 0 :(得分:14)

有(至少)两种写法

flatten::[[[Int]]] -> [[Int]]

一个是

flatten1 = concat
-- Example: flatten [[[1], [2]], [[3]]] = [[1], [2], [3]] :: [[Int]]

另一个是

flatten2 = map concat
-- Example: flatten [[[1], [2]], [[3]]] = [[1,2], [3]] :: [[Int]]

基本上,flatten1会使"中间"变平。括号水平,而flatten2使最内层"变平。括号水平。

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

concat . flatten1 = concat . flatten2 :: [[[Int]]] -> [Int]

实际上,两者都会在上面的例子中产生[1,2,3]

更高级的评论

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

join . fmap join = join . join :: Monad m => m (m (m a)) -> m a

其中m = [](即列表monad中)和a=Int

答案 1 :(得分:11)

您正在寻找

concat :: [[a]] -> [a]

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

答案 2 :(得分:2)

找到像你这样的问题的答案的最佳方法之一是使用hoogle。比如看看 http://www.haskell.org/hoogle/?hoogle=%5B%5B%5Ba%5D%5D%5D+-%3E+%5B%5Ba%5D%5D

concat函数在结果列表中排名第二。

还有hayoo:http://holumbus.fh-wedel.de/hayoo/hayoo.html搜索所有hackage。