在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
答案 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