0

这是我的功能。它检查正值,将它们更改为 1 并将它们相加。

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

有没有更好的策略来计算正值而不使用length,foldr和?mapfilter

4

2 回答 2

9

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

于 2012-12-07T16:56:55.767 回答
5

当然,只需直接计算它们foldr

countPositive = foldr (\n count -> if n > 0 then count + 1 else count) 0

或重新length实现foldr

countPositive = foldr (const succ) 0 . filter (>0)
于 2012-12-07T16:28:27.117 回答