2012-12-07 4 views
0

여기가 제 기능입니다. 양수 값을 확인하고 값을 1로 변경 한 다음 합합니다.양수 값을 계산하십시오.

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

length 그러나 다만 foldr, mapfilter을 사용하지 않고 양의 값을 계산하는 더 나은 전략이 있는가?

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

또는 foldrlength 다시 구현 :

답변

5

물론, 단지 직접 foldr로 계산

countPositive = foldr (const succ) 0 . filter (>0) 
+0

const succ를 설명 할 수 있습니까? – nick

+0

'const succ = \ a -> succ = \ a n -> succ n = \ a n -> n + 1'. 목록의 요소 (첫 번째 인수)를 무시하고 카운터를 증가시키기만합니다 (두 번째 인수). – huon

9

Foldr가 바로 여기에 보이지 않는다. 대신 foldl '을 원한다.

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

또는 또 다른 방법 : 당신이 어떤 이유로 length를 사용하지 않기 때문에

countPos :: (Num a, Ord a) => [a] -> Int 
countPos = length . filter (> 0) 

당신은 기본적으로 그냥 재발견 것 :

countPos = foldl' (\x _ -> succ x) 0 . filter (> 0) 

이 내 솔루션입니다 이것을 할 방법이 많이 있습니다. 이 게시물에 100 명이 답변하면 100 가지 방법으로 시도 할 수 있지만 가장 간단한 방법은 filterlength입니다.

관련 문제