
Shae Matijs Erisson wrote:
Gregory Woodhouse
writes: My knowledge of functional programming is pretty much limited to Haskell, Scheme, and a smattering of Common Lisp. Are there languages other than Haskell that explicitly use monads? How about "not so explicitly"?
Java http://www.ccs.neu.edu/home/dherman/code/monads/JavaMonads.tar.gz Joy http://permalink.gmane.org/gmane.comp.lang.concatenative/1506 OCaml https://mailman.rice.edu/pipermail/metaocaml-users-l/2005-March/000057.html Perl http://sleepingsquirrel.org/monads/monads.html Prolog http://logic.csci.unt.edu/tarau/research/PapersHTML/monadic.html Python http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/439361 Ruby http://moonbase.rydia.net/mental/writings/programming/monads-in-ruby/00intro... Scheme http://www.ccs.neu.edu/home/dherman/research/tutorials/monads-for-schemers.t...
Please respond with any language implementations I've missed.
The Java implementation is actually a little baroque because it doesn't
make use of generics. In June when there was a question here at Penn
about how critical type-classes were to the use of Monads, I put
together this quick example:
interface Monad<A> {
public <B> Monad<B> unit(B e);
public Monad<C> bind(Monad<B> e, MonadBindFun f);
}
interface MonadBindFun {
public Monad<B> fun(A x);
}
class OptionMonad<A> implements Monad<A> {
public <B> Monad<B> unit(B e) {
return new Some<B>(e);
}
public Monad<C> bind(Monad<B> e, MonadBindFun f) {
if(e instanceof Some) {
Some<B> eb = (Some<B>)e;
return f.fun(eb.get());
} else if (e instanceof None) {
return new None<C>();
} else {
throw new Error();
}
}
}
public class None<A> extends OptionMonad<A> implements Monad<A> {
public None() { }
}
public class Some<A> extends OptionMonad<A> implements Monad<A> {
A x = null;
public Some(A x) {
this.x = x;
}
public A get() { return x; }
}
Just a few minutes ago I wrote, but haven't tested the following:
import java.util.*;
public class ListMonad<A> implements Monad<A> {
List<A> list = null;
private ListMonad(List<A> list) {
this.list = list;
}
public <B> ListMonad<B> unit(B e) {
List<B> nlist = new LinkedList<B>();
nlist.add(e);
return new ListMonad(nlist);
}
public Monad<C> bind(Monad<B> e, MonadBindFun f) {
if(e instanceof ListMonad) {
ListMonad<B> be = (ListMonad<B>)e;
List reslists = new LinkedList
();
for(B x : be.list) {
Monad<C> res = f.fun(x);
if(res instanceof ListMonad) {
ListMonad<C> ce = (ListMonad<C>)res;
reslists.add(ce.list);
} else {
throw new Error();
}
}
List<C> flat = new LinkedList<C>();
for(List<C> x : reslists) {
flat.addAll(x);
}
return new ListMonad(flat);
} else {
throw new Error();
}
}
}
I also threw together a slightly cleaner version of these examples using
Scala, but I'm sure the Scala folks could do better than me.