mat*_*tic 0 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)
Run Code Online (Sandbox Code Playgroud)
我必须删除那些来自的列表 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]]
Run Code Online (Sandbox Code Playgroud)
也就是说,从一个由零和一个零的列表组成的列表中,提取一些列表.我试过了 filter (all odd) xss
让我们首先说明问题:
input是列表列表.每个列表都是非空的,由全0或全1组成.输出应该是全0的列表.
所以我们要过滤掉全部为0的列表.最简单的方法是:
filter (all (==0)) xss
Run Code Online (Sandbox Code Playgroud)
这要求我们检查0的列表的所有元素,并且只检查1的列表中的单个元素.我们可以通过仅检查第一个元素来做得更好:
filter ((==0) . head) xss
Run Code Online (Sandbox Code Playgroud)
现在我们的假设是没有列表是空的.我们可以通过删除空列表来保持健壮:
filter (\xs -> not (null xs) && head xs == 0) xss
Run Code Online (Sandbox Code Playgroud)