highj・・・Java8による本当の関数型プログラミング?

最近以下のようなJava8の記事

Java 8を関数型っぽく使うためのおまじない

をちょくちょく見かけるようになったので、自分もなにか書こうと思い、前からちょっとだけ気になっていた、highjというライブラリ

https://code.google.com/p/highj/
https://github.com/svn2github/highj/tree/master/branches/java8/src/main/java/org/highj

を読んでみて、概要を書いてみます。



Java関数型プログラミングというと、functional java

https://github.com/functionaljava/functionaljava

という、一年くらい前にちょっとblogにも書いたものがあります。

http://d.hatena.ne.jp/xuwei/20120427/1335542461

で、今回なぜhighjを紹介するのかというと、
highjがJava8対応をはじめているからです(functional javaのほうは、そういう話がまだほとんどでてこないfunctional javaも対応したようです)


highjが実用的かどうか?とか、いやそれScalaで(ryとかいう観点で書くのは考えるのが面倒なので、そうではなく、highjがどれほど徹底していて変態的なのかを中心に書いてみようかと思います。



typeclassの種類が豊富

まぁ、とにかくこれにつきますね。functional Javaとくらべても(場合によってはScalazよりも)明らかに多いです。
「そんなものまであって、実際使いやすいの?」
という疑問は残りますが・・・。まずこれを書いている時点でのtypeclass一覧を列挙してみます。

Monad Transformer

ちょっとまだ少ない?そもそも、実際使いやすいのかな・・・

data structure

かなり基本的なものだけある感じ。もっとあってもいいと思う

higher order type polymorphismをsimulationするためのなにか

https://github.com/svn2github/highj/tree/805e7313775095d1653ce4209cfcd4da298e2515/branches/java8/src/main/java/org/highj

以下のような、明らかに怪しそうな名前のものがあります。

  • _.java
  • __.java
  • ___.java
  • ____.java

コメントには

An interface for "lifting" a type constructors to type parameter level in order to allow the simulation of higher order type polymorphism. The "hidden" class µ (which should be an inner static class of the type constructor with a private constructor) identifies the type class and allows to cast values back to their normal version. For this, the type constructor should provide a static method called narrow.

と書いてあります。もうちょっと調べないとよくわからなそうなので、まぁ気が向いたらあとで書きます。あと、
HigherKinded.java
というものもあったりします・・・。



あとは、色々ユーティリティがあったり、「まぁJavaで関数型プログラミングやるなら必要になるだろうな」という、上記のtypeclassに比べたら当たり前の機能(?)がある感じです。(functional javaにもある程度似たようなものある)
とにかくtypeclassは豊富だけれども、それ以外はまだまだ細かいもの足りなそうなので、頑張って欲しいですね。


単に列挙して紹介しただけでしたが、testのディレクトリ以下に、実際の使い方のコード例それなりにあるので、

https://github.com/svn2github/highj/tree/805e7313775095d1653ce4209cfcd4da298e2515/branches/java8/src/test/java/org/highj

興味が湧いた人は見てみればいいとおもいます。


あと実装に関しても、lambdaはもちろん、メソッド参照や、interfaceのデフォルト実装などをふんだんに使ってて、Java8のコード例として面白いとおもいます。