概要
- https://github.com/functionaljava/functionaljava/tree/12e4d23954d352bcb16b43eed09dbc3624ce5e96 のtreeの時点での記録
- これを書いてる2012年4月現在sbt0.7.4でbuildされている
- sbtやmavenの標準のディレクトリ構成
- 昔は google code にあったみたい
- なぜかgithub上にtagうってない・・・
- maven centralにあるらしく、sbtならば
libraryDependencies += "org.functionaljava" % "functionaljava" % "3.0"
だけで使用可能
モジュールの分類
-
- core メインとなるソース
- core/src/main は 44563 行
- core/src/test は 1264 行
- テストはすべてScalacheckで書かれている
- demo サンプルコード
- 2038行
- それなりに充実してるので、みんな読みましょう
- core メインとなるソース
F
- F 〜 F8までの関数のためのclassは、fという名前のメソッドのみ抽象メソッド。mapなどする場合にその場で無名クラス生成して渡す用途など。
- FやF2には、カリー化や、Stream、Option、Either、Iterable、Promise、NonEmptyList、Tree、Validationなどへの変換やユーティリティが組み込まれていたり、(Scala標準と比べて)かなり多機能。というかFunctionのclassの側に持ったほうが、使う側が都合がいいからあるという感じだろうか。
P
- PからP8は、関数型言語でいえば、いわゆる代数型だとおもう。Scalaだとscalaパッケージ直下の Product1 、Product2... という、case classや、Tuple
の親に相当するもの - 勿論P〜P8はすべてimmutable
- P1ならば、_1という抽象メソッドが1つ。P3ならば、_1 _2 _3 と抽象メソッドが3つという様になっている。
- Scalaでのcase classっぽいものを作る際には、これらを自ら継承して、それぞれ _1 、_2 というメソッドを実装して使用。
- Tupleという名前のclassはない・・・?ので
Tuple使いたい場合はP 〜 P8 の無名クラス生成するのか・・・?(調査中)P ~ P8の無名クラスを生成するためのstaticなメソッドが P.java に、 p という名前で存在するようです。(P〜P8生成用メソッドの名前がすべて p で、8つオーバーロードされてる。)あえて、Pを継承してTupleというclassを作ってないのは、なにか理由があるんだろうか?*1 - scalaでのcopyメソッド相当の、map1 〜 mapNという、n番目の要素を変更した新しいPを返すメソッドがある。
- BottomはScalaでのNothing相当だろうが、型システムとしてサポートされてないのにBottom型があって、どうやって効果的に使うのだろうという疑問が・・・
Equal
- Show同様、基本的にequalsもoverrideされていない!ので、Equal型クラスがあります
- これも明示的に渡さないといけないので(ry
Hash
- これが、結構functionalJava独自な気がするけれども、hashCodeをオーバーライドするかわりに、Hash値を生成可能かどうかを表す型クラスにしてあるみたい?
Primitive
- コンストラクタはprivateでstaticなfieldのみ
- Double から Int 変換などの、primitiveの相互変換のための関数オブジェクトが置いてある
Digit
- scalazにも同じようなものあるけど、(型レベル計算ができるわけでもないし)イマイチ使い方わかってない・・・
data/List
- immutableな片方向リンクリスト
- ScalaのListと同じようなメソッドもあるけど、違うメソッドもいっぱい。というか同じもののほうがすくないか。
- たとえばfoldRightでTrampolineのオブジェクト返すとかすごいな・・・
- (List構築時に一時的に使うための?) public static finalなBufferという内部classがある
data/Stream
- immutableで片方向リンクな遅延リスト・・・ってつまりScalaのStreamと概念的に一緒
- でもメソッドは結構違うものも多い・・・(なんかこれしか言ってない)
- ArrayとかListの相互変換があったり
- Promiseとか関連していて、面白そう。
data/$
- 関数型の知識が足りなくてうまく説明できない・・・
data/Array
- 内部に配列を持っていて、それをラップしてる。mutable
- setがUnit返すとか素晴らしいですね
data/Java
- ArrayList,BitSet,EnumSet,HashSet,LinkedHashSet,LinkedList,Stack,TreeSet などなど、javaの標準のcollectionのほぼすべて(?)にたいして、fjのLitやStreamとの相互変換を提供するための関数オブジェクトがおいてある
TODO まだデータ構造いっぱいあるので、ヤル気がでたらこのあたりに追記・・・
core/src/main/java/fj/ 以下のディレクトリ毎に分けてみた
- Functionオブジェクトや、基本的な型クラスなど、一番よく使うと思われるものがfjパッケージ直下に置いてある
- control
- control直下にあるのはTrampolineだけ
- db
- parallel
- (作ってる人同じだから当たり前だが)ファイル構成をみる限り最小限でコンパクトなところが、Scalazのconcurrentモジュールにかなり似ている感じ。Actor,Callables,ParModule,Promise,Strategy
- data
- データ構造。結構基本的なものは網羅されていそう。Array, Conversions, Either, Enumerator, HashMap, HashSet, IO, IterableW, Iteratee, Java, LazyString, List, Natural, NonEmptyList, Option, Seq, Set, Stream, Tree, TreeMap, TreeZipper, Validation, Zipper
- fingertrees
- Fingertreeというデータ構造ためのclass一式。「public な class を1ファイルに対応させる必要がある」ので package-infoを除いて14ファイルもある。。。
- hlist
- heterogeneousなlist
- vector
- function
- BigIntegers,Booleans,Characters,Doubles,Integers,Longs,Stringsと基本的な型についてよく使うとおもわれる関数を置いてある。Visitor(できれば後述)がちょっと面白そう
- parser
- Parser 。。。どのくらい使えるのだろうか
- test
tree表示しただけのもの↓
fj ├── Bottom.java ├── Class.java ├── Digit.java ├── Effect.java ├── Equal.java ├── F.java ├── F2.java ├── F3.java ├── F4.java ├── F5.java ├── F6.java ├── F7.java ├── F8.java ├── Function.java ├── Hash.java ├── Monoid.java ├── Ord.java ├── Ordering.java ├── P.java ├── P1.java ├── P2.java ├── P3.java ├── P4.java ├── P5.java ├── P6.java ├── P7.java ├── P8.java ├── Primitive.java ├── Semigroup.java ├── Show.java ├── Unit.java ├── control │ ├── Trampoline.java │ ├── db │ │ ├── Connector.java │ │ ├── DB.java │ │ ├── DbState.java │ │ └── package-info.java │ ├── package-info.java │ └── parallel │ ├── Actor.java │ ├── Callables.java │ ├── ParModule.java │ ├── Promise.java │ ├── Strategy.java │ └── package-info.java ├── data │ ├── $.java │ ├── Array.java │ ├── Conversions.java │ ├── Either.java │ ├── Enumerator.java │ ├── HashMap.java │ ├── HashSet.java │ ├── IO.java │ ├── IterableW.java │ ├── Iteratee.java │ ├── Java.java │ ├── LazyString.java │ ├── List.java │ ├── Natural.java │ ├── NonEmptyList.java │ ├── Option.java │ ├── Seq.java │ ├── Set.java │ ├── Stream.java │ ├── Tree.java │ ├── TreeMap.java │ ├── TreeZipper.java │ ├── Validation.java │ ├── Zipper.java │ ├── fingertrees │ │ ├── Deep.java │ │ ├── Digit.java │ │ ├── Empty.java │ │ ├── FingerTree.java │ │ ├── Four.java │ │ ├── MakeTree.java │ │ ├── Measured.java │ │ ├── Node.java │ │ ├── Node2.java │ │ ├── Node3.java │ │ ├── One.java │ │ ├── Single.java │ │ ├── Three.java │ │ ├── Two.java │ │ └── package-info.java │ ├── hlist │ │ ├── HList.java │ │ ├── HPre.java │ │ └── package-info.java │ ├── package-info.java │ └── vector │ ├── V.java │ ├── V2.java │ ├── V3.java │ ├── V4.java │ ├── V5.java │ ├── V6.java │ ├── V7.java │ ├── V8.java │ └── package-info.java ├── function │ ├── BigIntegers.java │ ├── Booleans.java │ ├── Characters.java │ ├── Doubles.java │ ├── Integers.java │ ├── Longs.java │ ├── Strings.java │ ├── Visitor.java │ └── package-info.java ├── package-info.java ├── parser │ ├── Parser.java │ ├── Result.java │ └── package-info.java └── test ├── Arbitrary.java ├── Arg.java ├── Bool.java ├── CheckResult.java ├── Coarbitrary.java ├── Gen.java ├── Property.java ├── Rand.java ├── Result.java ├── Shrink.java ├── Variant.java ├── package-info.java └── reflect ├── Category.java ├── Check.java ├── CheckParams.java ├── Main.java ├── Name.java ├── NoCheck.java └── package-info.java