我想要做的就是我的请求。该函数的类型签名应该是这样的:
flatten::[[[Int]]] -> [[Int]]
我尝试搜索一些扁平化代码,但它们定义了新类型,这让我感到困惑。 有任何帮助吗?
我尝试搜索一些扁平化的代码,但它们定义了新类型,这使我感到困惑。是否可以提供帮助?
至少有两种方法可以写作。
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
时
你正在寻找
concat :: [[a]] -> [a]
在你的使用场景中,元素类型恰好是 [Int]
。
寻找像你这样的问题的最佳方法之一是使用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。
[[[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 NFfmap join
和join
的区别。 - Will Ness