2017-02-14 6 views
6

표기를하고 모나드에 반환한다고 가정 나는 코드 Just [3,5]하스켈 :

어떻게 하스켈 그 출력 값이 Maybe 모나드에 있어야 알고 있지 출력

do {x <- (Just 3); y <- (Just 5); return (x:y:[])} 

다음습니까? 즉, return[[3, 5]]을 출력 할 수 있습니다.

Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[] 

답변

18
do {x <- (Just 3); y <- (Just 5); return (x:y:[])} 

desugars >>=의 유형 Monad m => m a -> (a -> m b) -> m b이며, 인수 Just 3 (또는 Just 5) 우리가 m ~ Maybe이 당 식의 반환 형식은 일부 Maybe 유형이어야하기 때문에.


category theory에서 natural transformations라는 것을 사용하여이 반환 [[3, 5]] 만들 수있는 가능성이있다. 즉 Maybe a에서 [a]을 자연스럽게 변형,

alpha :: Maybe a -> [a] 
alpha Nothing = [] 
alpha (Just a) = [a] 

이 존재하기 때문에 우리가 원하는 기능은 단순히 결과에 적용되는 자연의 변화라고이이 자연적인 변화이기 때문에 당신이

alpha (Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[]) 
-- returns [[3, 5]] 

@duplode (을)를 지적

alpha (Just 3) >>= \x -> alpha (Just 5) >>= \y -> return $ x:y:[] 
-- returns [[3, 5]] 

: 또한 첫 alpha와 두 번째 함수를 적용 할 수 있습니다 패키지 Data.MaybealphamaybeToList입니다.

+1

이'alpha '는'Data.Maybe'에서'maybeToList'로 사용할 수 있습니다. – duplode