2012-02-27 4 views
3

값 위로 fmap을 사용하면 본질적으로 해당 값의 "저장을 해제"하고 기능을 적용한 다음 다시 상자에 넣습니다. 예를 들어하스켈의 일반적인 'unwrap'기능은 무엇입니까?

:

-- returns Just 8 
fmap (+3) (Just 5) 

나에게 다시 그것을 권투없이 값을 제공하는 함수가 있나요?

-- returns 8 
fmap_2 (+3) (Just 5) 

내가이 배열에 대해 어떻게 작동하는지 모르는, 부여,하지만 초보자를위한 Either들과 Maybe의, 유용 할 것입니다.

-- myfunc :: Maybe Int 

-- if myfunc returned a Just, show it and then print it. Otherwise, print 'Nothing'. 
putStrLn . fmap show $ myfunc 

또는 모나드를 혼합의 또 다른 표준 방법이 : 나는 쉽게 모나드를 혼합하는 데 사용할 수 있을까?

+5

아니요, 모나드를 혼합하는 표준 방법은 없습니다. 있을 수 없다. 모나드는 출퇴근하지 않습니다. 그러나 * 일부 모나드는 특별한 방법으로 혼합 될 수 있습니다. 이러한 특수한 모나드 믹싱 방법을 패키징하는 확립 된 방법을 모나드 트랜스 포머라고합니다. 거기 모나드 변압기의 여러 라이브러리, 그리고 광범위한 문학이 있습니다. 그냥 구글 "모나드 변압기". –

+0

보세요 : [모나드 액션에서 가치를 추출하는 방법?] (http://stackoverflow.com/questions/8567743/how-to-extract-value-from-monadic-action) –

답변

9

하십시오 Nothing을 얻는 경우에만

maybe 0 (+3) $ Just 5 
>>> 8 
maybe 0 (+3) Nothing 
>>> 0 

당신은 fromJust를 사용해야은 비정상적인 상황으로 간주해야합니다. 정말 좋은 이유없이 프로그램을 중단시키는 습관을 가지지 마십시오. MaybeEither은 정확하게 피할 수 있도록 도와줍니다.

either (*2) (+2) $ Left 3 
>>> 6 
either (*2) (+2) $ Right 3 
>>> 5 

가 올바른 코드에서 자주 모나드를 추출 할 필요가 없습니다 참고 :

Either하는 기능 either있다. 하스켈은 모나드 값으로 작업하는 데 필요한 모든 도구를 추출한 것처럼 제공해야합니다.

+4

또한 'FromMaybe :: a -> 아마도 a -> a'가 있습니다. – rampion

+0

+1에 마지막으로 절 – amindfv

5

이 함수는 모두 펑터에는 존재할 수 없습니다. Maybe과 같은 단순한 경우에도 Nothing이 있으면 작동하지 않습니다. IO의 경우 이는 프로그램에서 임의의 IO를 수행하고 안전하지 않게됩니다. 마지막으로, 약간 더 별달한 펑터 (예 : (->) e은 단지 e 유형의 인수를 취하는 함수 임)에 대해서는 아무런 의미가 없습니다.

그러나 일부 유형의 경우 펑 터이며이 함수가 있습니다. 예를 들어 fromJust이라는 유형의 Maybe a -> a이라는 함수가 있습니다. 그러나이 함수에 Nothing을 전달하면 런타임 오류가 발생합니다.

따라서 이와 같은 함수는 Functor의 인스턴스 인 일부 유형에도 존재할 수 있지만 Functor 클래스 자체에는 의미가 없습니다. Maybe 사용 maybe 추출