在Haskell中,给定列表列表,其中每个子列表包含任意数量的整数,如何编写一个返回所有列表中元素总数的函数?
例如,如果我的列表是:
[[1,2,3],[4,3],[2,1],[5]]
Run Code Online (Sandbox Code Playgroud)
该函数将返回8,因为列表列表中总共有8个元素.我知道你可以length []用来获取普通列表的长度,但是如何使用列表列表呢?我认为解决方案是递归的,但可以使用一些帮助,因为我是该语言的新手.
三种方式:
获取每个内部列表的长度,并将它们全部加起来:
GHCi> sum (fmap length [[1,2,3],[4,3],[2,1],[5]])
8
Run Code Online (Sandbox Code Playgroud)
(请注意,这等同于托马斯·英的回答:map是fmap专门到列表.)
展平列表列表,然后获取长度:
GHCi> length (concat [[1,2,3],[4,3],[2,1],[5]])
8
Run Code Online (Sandbox Code Playgroud)使用Compose包装器,它将length钻取两层列表.
GHCi> import Data.Functor.Compose
GHCi> length (Compose [[1,2,3],[4,3],[2,1],[5]])
8
Run Code Online (Sandbox Code Playgroud)
(虽然在这里解释到底发生了什么有点棘手 - 简而言之,我们正在利用它Compose有一个Foldable实例 - 在幕后它归结为非常像第一个解决方案.)
我认为解决方案是递归的
确实.这只是额外的递推通过我们使用的其他功能(执行fmap的列表,sum,concat等),所以我们不必明确写入递归算法.