如何在Haskell中将一个列表的列表的列表展平

15

我想要做的就是我的请求。该函数的类型签名应该是这样的:

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

我尝试搜索一些扁平化代码,但它们定义了新类型,这让我感到困惑。 有任何帮助吗?


我尝试搜索一些扁平化的代码,但它们定义了新类型,这使我感到困惑。是否可以提供帮助?

1
Hoogle 很有帮助。;) - vek
2
有两种展平的方式。你指的是哪一个?[[[1,2],[3,4]],[[5,6],[7,8]]] -> [[1,2,3,4],[5,6,7,8]][[[1,2],[3,4]],[[5,6],[7,8]]] -> [[1,2],[3,4],[5,6],[7,8]] - Sassa NF
那就是 fmap joinjoin 的区别。 - Will Ness
1
@vek Hoogle没有返回任何结果。你能修复链接吗? - Björn Lindqvist
3个回答

26

至少有两种方法可以写作。

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]

一个更高级的评论

上述法则实际上是非常著名的一个法则,因为它是单子定律的一个特殊情况。

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

m = [](即在列表单子中),且 a=Int


20

你正在寻找

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

在你的使用场景中,元素类型恰好是 [Int]


2

1
Hoogle 没有找到任何结果。 - Björn Lindqvist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接