函数的类型签名应该是这样的:
flatten::[[[Int]]] -> [[Int]]
我试着搜索一些扁平代码,但它们定义了新的类型,这让我很困惑。有帮助吗?
plicqrtu1#
(至少)有两种写法
一是
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会展平“最内层”层级的括号。作为一个练习,你可能想说服自己
flatten1
flatten2
concat . flatten1 = concat . flatten2 :: [[[Int]]] -> [Int]
实际上,在上面的例子中,两者都将产生[1,2,3]。
[1,2,3]
上述定律实际上是一个非常著名的定律,因为它是单子定律的特例
join . fmap join = join . join :: Monad m => m (m (m a)) -> m a
其中m = [](即在单子中),而a=Int
m = []
a=Int
toe950272#
您正在寻找
concat :: [[a]] -> [a]
在您的用例中,元素类型恰好是[Int]。
[Int]
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。
3条答案
按热度按时间plicqrtu1#
(至少)有两种写法
一是
另一个是
基本上,
flatten1
会展平“中间”层级的括号,而flatten2
会展平“最内层”层级的括号。作为一个练习,你可能想说服自己
实际上,在上面的例子中,两者都将产生
[1,2,3]
。更高级的评论#
上述定律实际上是一个非常著名的定律,因为它是单子定律的特例
其中
m = []
(即在单子中),而a=Int
toe950272#
您正在寻找
在您的用例中,元素类型恰好是
[Int]
。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。