2013-08-02 4 views
5

I는 타입 함수 싶은 :catMaybes 좋아 하스켈 함수이지만 갖는 형태 [아마] -> 아마 [A]

f :: [Maybe a] -> Maybe [a] 

예를 내 fNothing에 대한 매우 심각한 상태에서 그 catMaybesNothing 무시를 제외하고

f [Just 3, Just 5] == Just [3, 5] 
f [Just 3, Nothing] == Nothing 
f [] == Just [] 

그것은 Data.Maybe에서 catMaybes :: [Maybe a] -> [a] 유사하다.

f :: [Maybe a] -> Maybe [a] 
f xs = let ys = catMaybes xs 
     in if length ys == length xs 
      then Just ys 
      else Nothing 

또는

f :: [Maybe a] -> Maybe [a] 
f xs = if all isJust xs 
     then catMaybes xs 
     else Nothing 
+6

일반적인 휴리스틱 스 - 일반적인 목록 기능을 작성하고 '길이'(특히 두 번 이상 사용하는 경우)를 사용하여 자신을 발견하면 아마도 잘못된 결과를 낳을 것입니다. Haskell의 대부분의 목록 코드에는 적합하지 않습니다. 항상 그런 것은 아니지만 배우는 동안 사용하지 않는 편이 잘못되었습니다. :-) – shachaf

+4

의심스러운 경우 [hoogle] (http://www.haskell.org/hoogle/?hoogle=%5BMaybe+a%5D+-%3E+Maybe+%5Ba%5D). Hoogle에서'[Maybe a] -> Maybe [a]'를 검색하여 아래에 올바른 답을 얻었습니다 ('sequence'). – aaronlevin

+1

나는 그걸 알아보고'catMaybes'에 주목했다. 'sequence'가 목록의 첫 번째 항목이었습니다. 형식이 'Maybe'가 아니고 'Monad'가 아니기 때문에 무시 했으므로 연결을 인식하지 못했습니다. – Causality

답변

20

당신이 검색하는 기능은 순서라고 :

sequence :: (Monad m) => [m a] -> m [a] 

당신은 hoogle 사용하여이 기능을 찾을 수 있습니다 link.

예 :

>>> sequence [Just 3, Just 5] 
Just [3,5] 

>>> sequence [] :: Maybe [Int] 
Just [] 

주 :이 약간 일반화이다 Data.Traversable에서 sequenceA도하지만, Control.Monad에서 사용 사례 시퀀스에 대한 충분하다.

7

당신은 Control.Monad에서 sequence를 원하는 : ("실용적 펑"와 같은) 더 관용적 인 방법이 있다면 나는 (아래 그림 참조) 순진하게 f을 구현하지만 궁금 수 .

(이것은 또한 Data.Traversable에 유용한 방법으로 일반화되어있다.)