从列表列表中筛选列表

时间:2018-02-11 11:07:25

标签: haskell functional-programming

在Haskell中,我遇到以下问题:

toBin :: Integer -> Integer
toBin n = read (showIntAtBase 2 intToDigit n "")

-- λ> toBin 558745840
-- 100001010011011100100011110000
-- (0.01 secs, 117,680 bytes)

digitosAgrupados :: Integer -> [[Integer]]
digitosAgrupados n = group [read[d] | d <- show n]

-- λ> digitosAgrupados (toBin 558745840)
-- [[1],[0,0,0,0],[1],[0],[1],[0,0],[1,1],[0],[1,1,1],[0,0],[1],[0,0,0],[1,1,1,1],[0,0,0,0]]
-- (0.01 secs, 288,624 bytes)

我必须删除来自digitosAgrupados n

的列表
[[1],[0,0,0,0],[1],[0],[1],[0,0],[1,1],[0],[1,1,1],[0,0],[1],[0,0,0],[1,1,1,1],[0,0,0,0]] --> [[0,0,0,0],[0],[0,0],[0],[0,0],[0,0,0],[0,0,0,0]]

也就是说,从由1和0列表组成的列表中,提取一些列表。我试过filter (all odd) xss

1 个答案:

答案 0 :(得分:5)

让我们先说明问题:

  

输入是一个列表列表。每个列表都是非空的,由全0或全1组成。输出应该是那些全为0的列表。

所以我们要过滤掉全部为0的列表。最简单的方法是:

filter (all (==0)) xss

这要求我们检查0的列表的所有元素,并且只检查1的列表中的单个元素。我们可以通过仅检查第一个元素来做得更好:

filter ((==0) . head) xss

现在我们的假设是没有列表是空的。通过删除空列表,我们可以做到这一点:

filter (\xs -> not (null xs) && head xs == 0) xss