packages feed

purescript-0.6.4.1: examples/passing/Monad.purs

module Main where

  import Prelude ()

  type Monad m = { return :: forall a. a -> m a
		 , bind :: forall a b. m a -> (a -> m b) -> m b }

  data Id a = Id a

  id :: Monad Id
  id = { return : Id
       , bind : \ma f -> case ma of Id a -> f a }

  data Maybe a = Nothing | Just a

  maybe :: Monad Maybe
  maybe = { return : Just
	  , bind : \ma f -> case ma of
	      Nothing -> Nothing
	      Just a -> f a
	  }

  test :: forall m. Monad m -> m Number
  test = \m -> m.bind (m.return 1) (\n1 ->
		 m.bind (m.return "Test") (\n2 ->
		   m.return n1))

  test1 = test id

  test2 = test maybe

  main = Debug.Trace.trace "Done"