monax icon indicating copy to clipboard operation
monax copied to clipboard

Brings monads with nice syntactic sugar to Haxe

h1. Monax macro library.

This library, built on top of Haxe macros give the user the possibility to define specific Monad instance and get automatically access to a haskell like sugared syntax. About monad: http://en.wikipedia.org/wiki/Monad_(functional_programming)#Background

The syntactic sugar rely on the existence 'ret' and 'flatMap' in the Monad instance. It also requiers the existence of 'map' to provide automatic optimisations.

h2. Learn the (not so) hard way - Defining a Monad instance.



package mypackage;

class OptionM {

  public static function monad(o : Option) return OptionM; // will help with syntactic Sugar (see below)
    
  @:macro public static function dO(body : Expr) return // the function to trigger the Monad macro.
    Monad.dO("mypackage.OptionM", body, Context)

  inline public static function ret(x : T) return // creates an element
    Some(x)
  
  inline public static function map  (x : Option, f : T -> U) : Option {
    switch (x) {
      case Some(x) : return Some(f(x));
      default : return None;
    }
  }

  inline public static function flatMap(x : Option, f : T -> Option) : Option {
    switch (x) {
      case Some(x) : return f(x);
      default : return None;
    }
  }
}


h2. Using a Monad instance (Option here).


        OptionM.dO({
          value 

Due to optimisations; this code reduce to Some(165), those optimisations are applied by default. One can define his own optimisations (feeding the Monad.dO method its last parameter)


  @:macro public static function dO(body : Expr) return
    Monad.dO("mypackage.OptionM", body, Context, myCustomTransformation)

(please refer to the default function code to make sense of how to make optimization - macro knowledge requiered).

or using no optimisation at all:


  @:macro public static function dO(body : Expr) return
    Monad.dO("mypackage.OptionM", body, Context, Monad.noOpt)

h2. Syntactic Sugar support.

Monax provides some leaner syntax:


        import com.mindrocks.monads.Monad.dO in Do;
        ...
        Do({
          value