2012-07-03 21 views
6

En this tutorial que he encontrado el siguiente fragmento:Tal mónada precedencia función se unen

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 

no puedo averiguar cómo se supone que la función >>= a trabajar. En un primer momento se necesita un valor Maybe a como primer parámetro: deposit 100 account >>=

Posteriormente, sin embargo, parece tener a -> Maybe a como primer parámetro: withdraw 200 >>= ¿Cómo pudo ser aprobado por el compilador? ¿No debería >>= tomar siempre Maybe a como primer parámetro?

Una posible solución sería que la precedencia de la función >>= funcionaría de la siguiente manera: ((a >>= b) >>= c) >>= d

Pero por lo que yo sé, es todo lo contrario: a >>= (b >>= (c >>= d))

+2

Puede haberlo confundido con la notación 'do':' do a <- b; c <- d; e' es 'b >> = (\ a -> d >> = (\ c -> e))'. – sdcvvc

+0

@sdcvvc: Gracias, esta fue de hecho la fuente de mi confusión. – kahoon

+0

Tenga en cuenta también que no es la "posible precedencia de la función de enlace de mónada"; no puede tener diferentes precedencias para diferentes instancias de clase de tipo, por lo que tendría que ser la precedencia para * all * monads 'binds. – Ashe

Respuesta

14

por lo que yo sé , es todo lo contrario: a >>= (b >>= (c >>= d))

no.

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

infixl significa que es asociativo por la izquierda, por lo a >>= b >>= c >>= d ≡ ((a >>= b) >>= c) >>= d.

No tendría mucho sentido si fuera infixr, ¿o sí? >>= siempre devuelve una mónada, y su RHS toma una función. Por lo tanto, en , cualquier cadena de expresiones monádicas vinculada con >>= estaría en la mónada (->) r, que difícilmente es la más útil.