2012-12-06 5 views
3

내가 함수가 표준 하스켈 기능 : (A -> 아마) -> A -> [A]

maybeToList :: (a -> Maybe a) -> a -> [a] 
maybeToList f x = x : maybe [] (maybeToList f) (f x) 
이 기능은 내가 믿을 수 없을 정도로 분명한 것 같다

를 정의한 표준 아닙니다 . 일부 모듈에 정의되어 있습니까 (이미 Data.Maybe를 선택 했습니까?). 이 one that is의 전문 형태이기 때문에

+1

'maybeToList'는 이미'Data.Maybe'에 그 이름을 가진 함수가 있다고 생각합니다. 즉, maybeToList = maybe [] (: [])'입니다. 'unfoldStream' 또는 뭔가 있을까요? – luqui

답변

6

귀하의 기능은 표준 라이브러리에없는 :

말했다
unfoldr  :: (b -> Maybe (a, b)) -> b -> [a] 
unfoldr f b = 
    case f b of 
    Just (a,new_b) -> a : unfoldr f new_b 
    Nothing  -> [] 

, 종자 값의 순서가 공통으로 목록 요소가 동일한 경우, 그리고 그냥 unfoldr과 다른 표준 함수로 작성하는 것이 서투르기 때문에 표준 라이브러리에도 왜 그런지 모르겠습니다.

+1

고마워요, 제가 'unfoldr (join (,). foo)'라고 쓰는 것보다는 함수를 정의하는 것이 더 명확하다고 생각합니다 : p. – walpen