Skip to content

sledorze/monax

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

61 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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.

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



package mypackage;

class OptionM {

  public static function monad<T>(o : Option<T>) 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<T>(x : T) return // creates an element
    Some(x)
  
  inline public static function map < T, U > (x : Option<T>, f : T -> U) : Option<U> {
    switch (x) {
      case Some(x) : return Some(f(x));
      default : return None;
    }
  }

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


Using a Monad instance (Option here).


        OptionM.dO({
          value <= ret(55);
          value1 <= ret(value * 2);
          ret(value1 + 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)

Syntactic Sugar support.

Monax provides some leaner syntax:


import com.mindrocks.monads.Monad.dO in Do; ... Do({ value <= [55]; value1 <= return value * 2; return value1 + value; });

About

Brings monads with nice syntactic sugar to Haxe

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages