imo, the most import ingredient to understand monads, is to understand lazy evaluation. In Haskell, everything is about values. If you have a function f :: a -> b, then f x stands for a value of type b (nothing is evaluated yet). Now, if you have another function g :: a -> M b, then g x stands for a value of type M b, that is, a value of type b requiring something more (encoded by the monad M). Depending on which Monad you used, you need to do something the the value M b to get to the actual value b. In the case of the State monad, you have to run it with an initial state. In the case of IO, you can't do anything and so you have to give the value to the runtime-system (via the main-function). In the case of the List monad (which represents non-determinism), you can choose any element of the resulting list, or, more commonly, use every possible result (i.e. the whole list).
-- Thomas Danecker 2009/12/29 Maciej Piechotka <uzytkown...@gmail.com>: > On Tue, 2009-12-29 at 02:07 -0800, CK Kashyap wrote: >> Thanks Jason, >> >> >> > >> > You should make a `Functor' instance since monads are all >> > functors (though the typeclass does not enforce this). >> > >> What are the benefits of making it an instance of Functor? >> > > 1. For example to use function of type Functor f => f a -> f d. > > 2. Also you need Functor to have Applicative which is rather useful (f < > $> arg1 <*> arg2 <*> arg3 <*> ... as opposed to return f `ap` arg1 `ap` > arg2 `ap` arg3 ..., (*>), (<*) etc.) > > 3. Because it is functor ;). Every Monad is functor: > > instance Functor MyMonad where > fmap = liftM > instance Applicative MyMonad where > pure = return > (<*>) = ap > > 4. If you use Control.Applicative you can find: > read <$> getLine > I find it much more readable then liftM read getLine (it looks nearly > like read $ getLine). > > Regards > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe