List 计算正值

List 计算正值,list,haskell,List,Haskell,这是我的功能。它检查正值,将其更改为1并求和 countPositive :: [Integer] -> Integer countPositive xs = foldr (+) 0 $ map (^0) (filter (>0) xs) 是否有更好的策略可以不使用长度而只使用foldr、map和filter来计算正值?当然,只需使用foldr直接计算: 或使用foldr重新实现的长度: 福尔德似乎不在这里。你想换成foldl。这是我的解决方案: countPos :: (Num

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

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

是否有更好的策略可以不使用长度而只使用foldr、map和filter来计算正值?

当然,只需使用foldr直接计算:

或使用foldr重新实现的长度:


福尔德似乎不在这里。你想换成foldl。这是我的解决方案:

countPos :: (Num a, Ord a) => [a] -> Int
countPos = length . filter (> 0)
由于某些原因,您不想使用长度,因此基本上只需重新创建它:

countPos xs = sum (1 <$ filter (> 0) xs)

有很多很多方法可以做到这一点。如果有100人回答这篇文章,你可能会得到100种不同的方法,但最简单的方法是使用过滤器和长度。

你能解释一下const-succ吗?const-succ=\a->succ=\a-n->succ-n=\a-n->n+1。它忽略列表中的元素(第一个参数),而只是不断增加计数器(第二个参数)。
countPos :: (Num a, Ord a) => [a] -> Int
countPos = length . filter (> 0)
countPos xs = sum (1 <$ filter (> 0) xs)
countPos = foldl' (\x _ -> succ x) 0 . filter (> 0)