如何在haskell中展开列表的列表

kh212irz  于 2022-12-13  发布在  其他
关注(0)|答案(3)|浏览(382)

函数的类型签名应该是这样的:

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

我试着搜索一些扁平代码,但它们定义了新的类型,这让我很困惑。有帮助吗?

plicqrtu

plicqrtu1#

(至少)有两种写法

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

toe95027

toe950272#

您正在寻找

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

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

muk1a3rh

muk1a3rh3#

要找到像你这样的问题的答案,最好的方法之一就是使用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。

相关问题