2016-11-13 3 views
0

특정 위치에서 만 Nothing 항목이, Maybe n의 무한한 목록의 목록 takeWhile Nothing 첫째 :하스켈 : 어쩌면

012 :

howMany :: (Int -> Bool) -> [Maybe Int] -> Int 

이 내가 명시 적으로 재귀와 함께 온 것입니다

고급 하스켈 추상화를 사용하여이를 표현하는 더 좋은 방법이 있는지 궁금합니다.

+2

왜 'takeWhile isJust'를 수행하지 않고 이후에 계산합니까? – Carcigenicate

+0

'Just '생성자를 매치하지 않고서 어떻게'Maybe '리스트 안에 predicate를 넣고 세는 것이 좋을까요? –

+0

Nothings를 걸러 낸 다음 결과 목록을 접고 justs를 풀고 카운트합니다. – Carcigenicate

답변

3

다음과 같이 작동합니다.

import Data.Maybe (isJust, maybe) 
howMany p = length . filter (maybe False p) . takeWhile isJust 

또는 대안 당신은 또한 fromJust 대신 maybe 사용할 수 있습니다. 일반적으로 fromJust과 같은 부분 기능은 사용하지 않는 것이 좋지만이 경우 안전합니다.

import Data.Maybe (isJust, fromJust) 
howMany p = length . filter (p . fromJust) . takeWhile isJust 
+0

멋진 한 줄 짜기. 정확히 내가 무엇을 찾고 있었는지. –

+0

@LuigiSgro이 함수는 더 짧게 쓸 수도 있습니다 : 'howMany p = length. takeWhile (어쩌면 거짓 p)' – Shersh

+0

하지만 그 기능은 똑같지 않습니다. 그것은 단지 Nothing이 아니고'p'를 만족시키는 첫 번째 요소를 센다. 첫 번째 요소에서'p '를 만족하는 요소의 수를 셉니다.이 요소는 Nothing이 아닙니다. – jpath