2012-07-03 3 views
6

튜토리얼 this에서 아마 모나드 바인딩 기능 우선 순위 :내가 다음 코드를 발견했습니다

deposit :: (Num a) => a -> a -> Maybe a 
deposit value account = Just (account + value) 

withdraw :: (Num a,Ord a) => a -> a -> Maybe a 
withdraw value account = if (account < value) 
         then Nothing 
         else Just (account - value) 

eligible :: (Num a, Ord a) => a -> Maybe Bool 
eligible account = 
    deposit 100 account >>= 
    withdraw 200 >>= 
    deposit 100 >>= 
    withdraw 300 >>= 
    deposit 1000 >> 
    return True 

main = do 
    print $ eligible 300 -- Just True 
    print $ eligible 299 -- Nothing 

나는 >>= 기능이 작동하도록되어 방법을 알아낼 수 없습니다. 처음에는 첫 번째 매개 변수로 Maybe a 값을 취 : deposit 100 account >>=

는 이후, 그러나 그것의 첫 번째 매개 변수로 a -> Maybe a을 보인다 : withdraw 200 >>=를이는 컴파일러에 의해 승인 될 수 있는가? >>=은 항상 첫 번째 매개 변수로 Maybe a을 가져 가면 안됩니까? ((a >>= b) >>= c) >>= d

그러나 내가 아는 한, 그 반대입니다 : 내가 아는 a >>= (b >>= (c >>= d))

+2

'do'표기법과 혼동했을 수 있습니다. do a <- b; c <- d; e'는'b >> = (\ a -> d >> = (\ c -> e))'입니다. – sdcvvc

+0

@sdcvvc : 고마워요, 이것은 정말로 내 혼란의 근원이었습니다. – kahoon

+0

"아마도 모나드 바인딩 기능 우선 순위"가 아님을주의하십시오. 서로 다른 타입 인스턴스에 대해 다른 우선 순위를 가질 수는 없으므로 * 모든 * 모나드 바인딩에 우선 순위가 있어야합니다. – Ashe

답변

14

>>= 기능의 우선 순위는 다음과 같은 방식으로 작동 할 경우

가능한 솔루션이 될 것입니다 그것은 반대입니다 : a >>= (b >>= (c >>= d))

nope.

GHCi> :i >>= 
class Monad m where 
    (>>=) :: m a -> (a -> m b) -> m b 
    ... 
    -- Defined in `GHC.Base' 
infixl 1 >>= 

infixl 그것이 왼쪽 연관 있다고, 그래서 a >>= b >>= c >>= d ≡ ((a >>= b) >>= c) >>= d 의미한다.

infixr이라면 실제로 의미가 없습니다. >>=은 항상 모나드를 반환하고 RHS는 함수를 사용합니다. 따라서 에서 >>=과 연결된 모나드 표현의 체인은 (->) r 모나드에있을 것입니다. 모나드는 거의 유용하지 않습니다.

관련 문제