这是我的功能.它检查正值,将它们更改为1并对它们求和.
countPositive :: [Integer] -> Integer
countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs)
Run Code Online (Sandbox Code Playgroud)
是否有一个更好的策略来计算正值而不使用length
,只是foldr
,map
和filter
?
小智 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种不同的方法来做,但最简单的方法是使用filter
和length
.
当然,只需直接计算它们foldr
:
countPositive = foldr (\n count -> if n > 0 then count + 1 else count) 0
Run Code Online (Sandbox Code Playgroud)
或重新实现length
有foldr
:
countPositive = foldr (const succ) 0 . filter (>0)
Run Code Online (Sandbox Code Playgroud)