计算正值

pig*_*ack 0 haskell list

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

countPositive :: [Integer] -> Integer
countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs)
Run Code Online (Sandbox Code Playgroud)

是否有一个更好的策略来计算正值而不使用length,只是foldr,mapfilter

小智 9

Foldr似乎不在这里.你想要折叠'.这是我的解决方案:

countPos :: (Num a, Ord a) => [a] -> Int
countPos = length . filter (> 0)
Run Code Online (Sandbox Code Playgroud)

因为你不想length出于某种原因使用你基本上只是重新发明它:

countPos xs = sum (1 <$ filter (> 0) xs)
Run Code Online (Sandbox Code Playgroud)

还是另一种方法:

countPos = foldl' (\x _ -> succ x) 0 . filter (> 0)
Run Code Online (Sandbox Code Playgroud)

有很多很多方法可以做到这一点.如果有100个人回复这篇文章,你可能会有100种不同的方法来做,但最简单的方法是使用filterlength.


huo*_*uon 5

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

countPositive = foldr (\n count -> if n > 0 then count + 1 else count) 0
Run Code Online (Sandbox Code Playgroud)

或重新实现lengthfoldr:

countPositive = foldr (const succ) 0 . filter (>0)
Run Code Online (Sandbox Code Playgroud)