class Functor < Type -> Type
class Monad < Functor
type List : Monad
var a, b : Type
var m : Monad
op fail : m a
op return : a -> m a
var f : Functor
op fmap : (a -> b) -> f a -> f b
op empty : List a
type Set : Functor
op emptySet : Set a
. fail = emptySet
. fail = empty
op map : (a -> b) -> List a -> List b
op __bind__ : m a * (a -> m b) -> m b
var g : a -> b; var x : m a
. fmap g = map g
. fmap g x = x bind \ y: a .! return (g y)