这是我的功能。它会检查正值,将它们更改为1并对它们求和。
countPositive :: [Integer] -> Integer
countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs)
有没有更好的策略来计算正值而不使用length
而只是foldr
,map
和filter
?
答案 0 :(得分:9)
Foldr似乎不在这里。你想要折叠'。这是我的解决方案:
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
。
答案 1 :(得分:5)
当然,只需用foldr
直接计算它们:
countPositive = foldr (\n count -> if n > 0 then count + 1 else count) 0
或使用length
重新实现foldr
:
countPositive = foldr (const succ) 0 . filter (>0)