2013-09-21 2 views
-1

을 내 질문은가정이 코드 구문 설탕 할당

g = Just 5 >>= \x -> Just x 

는 사실에 할당 x <- Just 5 리드 있다는 것을 혼동하지를 x을 그 유형이 Int이고 Maybe Int이 아니십니까? 아니면 내가 틀렸어?

+5

혼란스러운 것은 당신이 묻는 사람에 달려 있습니다. 즉 완전히 주관적입니다. 아니면 귀하의 질문이 뭔가 다른가요? – delnan

+0

'g = Just 5 >> = \ x -> Just x'를'g = Just 5'로 간소화 할 수 있습니다. – wit

답변

3

아니요 혼란스럽지 않습니다. 또한 현실 세계의 문제에 좀 더 근접한 예를 펼치면이 모든 것에 대한 이유가 나타납니다. 예컨대 :

g :: Maybe Int 
g = do 
    x <- Just 5 -- THIS LINE, `x` is plain Int 
    Just (x + 3) 
x 여전히 Maybe Int 있다면 당신은이 문제를 해결할 방법

?

나는 this tutorial이 모나드를 이해하는 데 많은 도움이 될 것이라고 생각합니다.

+0

좋은 튜토리얼! 고맙습니다. – Cartesius00

2

x :: Int이 혼란 스럽다고 생각하면 틀린 것입니다. 여기에있는 실제 혼란은 x <- Just 5지정으로으로 인식하는 것입니다. 어떤 것을 할당하려면 먼저 값을 추출 할 수 있어야합니다. 일부 모나드에서는 가능하지만 모든 모나드에서는 가능하지 않습니다. 예를 들어, Maybe a은 하나의 값만 저장하므로 은 Maybe Int에서 값을 "추출합니다"라고 상상할 수 있습니다. 그러나 단지 목록을 고려해 보면 유추가 실패합니다 : [a], 여기서 x <- [1..5]은 더 이상 과제에 대한 직접적인 대응을하지 않습니다. 또한 임의의 모나드에서 값을 추출하는 함수가없는 이유이기도합니다. [Int]에서 Int을 "추출"하는 방법은 무엇입니까? Cont a Int에서 "Int"을 어떻게 "추출합니까"?

functor 나 모나드의 의미를 이해하려면 몇 가지 예제를 통해 작업해야합니다. m Int을 "Int가있는 컨테이너"가 아니라 "-ness가있는"m이라고 생각하는 것이 좋습니다. 즉, m의 특정 동작은 m이고 동작은 Int과 관련이 있습니다. 모나드 운영은 특정 법률을 준수해야하므로 "m 일부는 Int"으로 예를 들어 "m이고 일부는 Char"으로 일관되게 수정할 수 있습니다.

>>= 또는 <-이 아닌 "재미있는 구성"인 <=<을 "값 추출"으로 오해 할 수 있다고 생각하는 것이 좋습니다.

+0

'x <- Just 5'와'x :: Int'의 경우'x <- [1..5]'에'x'의 타입은 무엇입니까? – Cartesius00

+0

@ Cartesius00,'x'는'Int' 타입이지만,이 컨텍스트에서는 할당이 아닙니다. 적어도 정확하고 확실하게 명령형이 아닙니다. –