Taas kirjoitussuositus: http://blog.sigfpe.com/2007/04/trivial-monad.html
Kommenteissa pohdiskellaan, miten h toteutetaan. Tässä on kolme tapaa:
Prelude> data W x = W x deriving Show Prelude> instance Functor W where fmap f (W x) = W (f x) Prelude> instance Applicative W where pure = W; W f <*> W x = W (f x) Prelude> instance Monad W where W x >>= f = f x
Perinteinen monadinen ohjelmointi:
Prelude> h wx wy = wx >>= \x -> wy >>= \y -> return $ x+y Prelude> :type h h :: (Monad m, Num b) => m b -> m b -> m b
Monadikirjaston liftM2:
Prelude> import Control.Monad Prelude Control.Monad> h2 = liftM2 (+) Prelude Control.Monad> :t h2 h2 :: (Monad m, Num r) => m r -> m r -> m r
ap-kombinaattori, joka vastaa Applicativen <*>-operaattoria. Kirjoitettu applikatiiviseen tyyliin. (Voisi sanoa myös (+) <$> wx <*> wy.)
Prelude Control.Monad> h3 wx wy = ((+) <$> wx) `ap` wy Prelude Control.Monad> :type h3 h3 :: (Monad m, Num b) => m b -> m b -> m b