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))
Puede haberlo confundido con la notación 'do':' do a <- b; c <- d; e' es 'b >> = (\ a -> d >> = (\ c -> e))'. – sdcvvc
@sdcvvc: Gracias, esta fue de hecho la fuente de mi confusión. – kahoon
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