Hatena::Groupocaml-nagoya

yoshihiro503の関数的日記

2008-11-26 (Wed)

haXeでlistモジュールを作ってみた。

| 14:43 | haXeでlistモジュールを作ってみた。 - yoshihiro503の関数的日記 を含むブックマーク はてなブックマーク - haXeでlistモジュールを作ってみた。 - yoshihiro503の関数的日記

今流行りの関数型言語haXeを勉強ついでに、OCamlみたいなListモジュールを書いてみた。

class内にenumを定義することは出来ないみたいなので、List型は外で定義した。

enum ListT<E> {
    nil;
    cons(e: E, tl: ListT<E>);
}

class List {

    public static function length<E> (l:ListT<E>) {
	return switch (l) {
	case nil: 0;
	case cons (x, xs): 1 + length (xs);
	}
    }

    public static function fold_left<A, B> (f:A -> B -> A, a:A, l:ListT<B>) {
	return switch (l) {
	case nil: a;
	case cons (b, bs): fold_left (f, (f (a, b)), bs);
	}
    }

    public static function map<A, B> (f:A -> B, l:ListT<A>) {
	return switch (l) {
	case nil: nil;
	case cons (x, xs): cons (f (x), map (f, xs));
	}
    }

    public static function rev<A>(l:ListT<A>) {
	return rev_append(nil, l);
    }
    public static function rev_append<A> (store:ListT<A>, l:ListT<A>) {
	return switch (l) {
	case nil: store;
	case cons(x, xs): rev_append (cons (x, store), xs);
	}
    }


}

osiireosiire2008/11/28 10:12すばらしい。意図的かどうか分からないけど、iterとnthが無いのが面白い.

yoshihiro503yoshihiro5032008/11/28 10:28ありがとうございます。
取り合えず必要なものから定義していっています。
iterがないのは、まだ必要になっていないし、Unit型が必要になるからです。
nthがないのは、Option型が必要になるからです。