home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / gofer230.zip / Progs / Gofer / Demos / Ccexamples / combine.gs < prev    next >
Text File  |  1994-06-23  |  1KB  |  43 lines

  1. -- combine.gs                Mark P Jones  December 1992
  2. --
  3. -- The following script resulted from a discussion between myself
  4. -- and Luc Duponcheel on the comp.lang.functional newsgroup in
  5. -- December 1992.
  6. --
  7. -- This code fragment shows how the composition of monads can be
  8. -- described in Gofer using constructor classes.
  9.  
  10. class (Monad m, Monad l) => Composable m l where
  11.     prod  :: l (m (l a)) -> m (l a)
  12.     swap  :: l (m a) -> m (l a)
  13.     app   :: (l a -> m b) -> l (m a) -> m b
  14.  
  15.     prod  = app (result . join)
  16.     swap  = prod . map (map result)
  17.     app f = join . map f . swap
  18.  
  19. mmap f = swap . map f
  20.  
  21. instance Composable m [ ] where
  22.     swap []     = [ [] ]
  23.     swap (x:xs) = [ y:ys | y<-x, ys<-swap xs ]
  24.  
  25. type Comp f g a = f (g a) in mapComp, resultComp, joinComp
  26.  
  27. mapComp :: (Functor f, Functor g) => (a -> b) -> (Comp f g a -> Comp f g b)
  28. mapComp  = map . map
  29.  
  30. instance (Functor f, Functor g) => Functor (Comp f g) where
  31.     map = mapComp
  32.  
  33. resultComp :: (Monad f, Monad g) => a -> Comp f g a
  34. resultComp  = result . result
  35.  
  36. joinComp   :: (Composable f g) => Comp f g (Comp f g a) -> Comp f g a
  37. joinComp    = join . map prod
  38.  
  39. instance Composable f g => Monad (Comp f g) where
  40.     result = resultComp
  41.     join   = joinComp
  42.  
  43.