问题描述
我是 Haskell 的新手,我使用递归尝试了这个
f :: [[Integer]] -> Integer
f [] = 0
f [x] = 1
f ((x : xs) : xss)
| even x = 1 + f (xs : xss)
| otherwise = f (xs : xss)
但不起作用,我认为这是完全错误的。如何使用递归、列表理解和映射、过滤函数来实现这一点? 例如,f[[2,3,4],[1,0],5,7]] = 2
解决方法
如果我猜对了磁贴,你想计算所有内部列表,其中最多有 1 个偶数。
所以让我们拆分一下 - 首先计算列表中的所有偶数:
evenNumberCount :: [Integer] -> Int
evenNumberCount ls = length (filter even ls)
有了这个,我们可以测试一个列表是否最多有一个:
atMostOneEvenNumber :: [Integer] -> Bool
atMostOneEvenNumber ls = evenNumberCount ls <= 1
我想在这一点上很容易将答案拼凑起来:
f :: [[Integer]] -> Int
f ls = length (filter atMostOneEvenNumber ls)
你的例子:
> f[[2,3,4],[1,0],5,7]]
2
注意:这有错误的签名(因为 length :: [a] -> Int
) - 如果你想要 Integer
要么将 fromIntegral
添加到右侧或切换到 genericLength
并调整签名
(Haskellers 阅读注意事项:我知道 length :: Foldable t => t a -> Int
认为这在这里没有帮助;))