Haskell计算列表列表中的所有元素

Jam*_*ood 1 recursion haskell

在Haskell中,给定列表列表,其中每个子列表包含任意数量的整数,如何编写一个返回所有列表中元素总数的函数?

例如,如果我的列表是:

[[1,2,3],[4,3],[2,1],[5]]
Run Code Online (Sandbox Code Playgroud)

该函数将返回8,因为列表列表中总共有8个元素.我知道你可以length []用来获取普通列表的长度,但是如何使用列表列表呢?我认为解决方案是递归的,但可以使用一些帮助,因为我是该语言的新手.

dup*_*ode 8

三种方式:

  1. 获取每个内部列表的长度,并将它们全部加起来:

    GHCi> sum (fmap length [[1,2,3],[4,3],[2,1],[5]])
    8
    
    Run Code Online (Sandbox Code Playgroud)

    (请注意,这等同于托马斯·英的回答:mapfmap专门到列表.)

  2. 展平列表列表,然后获取长度:

    GHCi> length (concat [[1,2,3],[4,3],[2,1],[5]])
    8
    
    Run Code Online (Sandbox Code Playgroud)
  3. 使用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等),所以我们不必明确写入递归算法.