计算正值

时间:2012-12-07 16:24:28

标签: list haskell

这是我的功能。它会检查正值,将它们更改为1并对它们求和。

countPositive :: [Integer] -> Integer
countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs)

有没有更好的策略来计算正值而不使用length而只是foldrmapfilter

2 个答案:

答案 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种不同的方法,但最简单的方法是使用filterlength

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