这是我的功能。它检查正值,将它们更改为 1 并将它们相加。
countPositive :: [Integer] -> Integer
countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs)
有没有更好的策略来计算正值而不使用length
,foldr
和?map
filter
Foldr 似乎不在这里。你想要 foldl' 代替。这是我的解决方案:
countPos :: (Num a, Ord a) => [a] -> Int
countPos = length . filter (> 0)
由于您出于某种原因不想使用length
,您基本上只是重新发明它:
countPos xs = sum (1 <$ filter (> 0) xs)
或另一种方法:
countPos = foldl' (\x _ -> succ x) 0 . filter (> 0)
有很多很多方法可以做到这一点。如果有 100 人回答这篇文章,您可能会得到 100 种不同的方法,但最简单的方法是使用filter
和length
.
当然,只需直接计算它们foldr
:
countPositive = foldr (\n count -> if n > 0 then count + 1 else count) 0
或重新length
实现foldr
:
countPositive = foldr (const succ) 0 . filter (>0)