追記:
この記事書いたあとのtwitter上での反応 ScalazとHaskellの比較記事というか疑問点をいっぱい書いたら、shelarcyさんにいっぱい教えておもらったよ!
Scalaz7 では色々改善されている部分もあるけれど、まだ作りかけなので、とりあえずScalaz6.0.4で。自分のHaskellの知識が浅く、間違ってること言っている可能性大なので、なにかあればどんどん突っ込んでくださいm(_ _)m
- まず対応していそうなものをとにかく書きだしてみた ← 名前同じで、ほぼ同じ役割をしていると思われるもの。結構ある
- 無名関数の引数がカリー化されないので、Scalazのほうには、Haskellには存在しないApplicativeBuilderというものがある
- Scalazの場合Bifunctorというものがあるが、Haskellにbifunctorという単語がでてこない
- ほかにも、(monadやkleisliはでてくるのに)Comonad, Cokleisli という単語もでてこない? (このあたりの理由が理解できていないので誰か教えて!)
- この前の、stackoverflowで、monoidについて質問したので理解できましたが、monoidのinstanceの関連で、Haskellの場合たとえばFirstに関して こんな感じ でnewtypeで定義してあるけれど、Scalazの場合、正格評価版と遅延評価版の2種類あり(?)LazyOption FirstLazyOption FirstOption と関連するものがいっぱいあって、複数ファイルに分かれてる
- Ord が、Javaの Comparator Scala標準の Ordering Ordered 、さらに Scala標準がJavaとの互換性や思想に引きづられてかなりイケてないので、 Scalaz でべつに実装してある Order と、そのあたりの関連を考えるとちょっとめんどくさい
- Option ,List などの数種類に関しては、OptionT OptionW ListT ListW など拡張のためのclassが複数あるのでそのあたりも見ないといけない
- Scalaz6.0.4の場合、データ構造だろうが type class だろうが、ほとんど全部scalaz配下に置いてあるけれど、Haskellの場合ある程度Data ,Controlなどに分かれてる。このあたりの分け方は全然異なるので、対応するものを探すのがめんどくさい。どちらかというと、Haskellのほうが一つのファイルあたりのコード量がおおくて、Scalazのほうは、細かく分けてる?
- Scalazの場合、おそらくできるだけカッコを使わずに済むように書けるように*1するため、Identitiy や MA や MAB というものがあって、これに慣れないとどこに定義があるのかわかりにくい。 => Identityについては、恒等MonadというものでHaskellにもあるみたいですね
- HaskellにそもそもInvaliantという概念がないというか必要ない(?) *2ので、 Scalaz の InvariantFunctor とかHaskell側に存在しない(?)
- その他Scalazにあるけど、Haskell側になさそうなものというか、とにかく対応がよくわかってないtype classっぽいものを列挙。*3Pointed,Apply,Bindあたりに関しては、Scalazのほうが、MonadやApplicativeの部品を細かく分けて定義して組立てているという感じだろうか?
- データ構造
- BKTree コメントにリンクがあるように、Haskellのものをportingしたか参考にして作った感じ
- FingerTree
- ImmutableArray Arrayをwrapして要素を変更するような操作をできないようにしたり、ちょっと便利メソッドがあるだけで大したことはしていないみたい
- Heap これもコメントに " Based on the heaps Haskell library by Edward Kmett" って書いてある
- Tree データ構造っていう分類でいいのかな?
- Forall これに関しては、Haskellで言語レベルでサポートされているものを、Scalaでエミュレートするために用意されているらしい。この記事が素晴らしいのでみんな読みましょう。
- Leibnizこれも、コメント内にリンクがいくつかあったりそれなりに説明あるけど全く理解できてないな・・・コメント内にあるリンク↓
- Name byNameとlazy val使って 遅延評価させるためのもの(?)なので(デフォルト遅延評価の)Haskellにはなさそう
- HaskellにValidationない。これ読んで気がついたけれど、Monadとしてのinstanceの表現のやりかたを変えれば*5、EitherとValidationという、似たようなものをわざわざ(scalaの文法としての)classやtraitとして表現する必然性はなく、*6どちらか一方でいいのはないか? Validationの場合nonEmptyListとしてaccumulateするショートカットが用意されていたり、ちょっとだけ便利にはなっているけど・・・。それに関連して、こんなこと があるけれど、これも明らかに似ている気がするんだけれども、どうなんだろう・・・(例外処理に関する便利メソッドがくっついているだけで、大まかにみればEitherもしくはValidationと同型?)
これでもまだ、 scalaz core でHaskellで直接対応するものがあるわけではない、かつまだ触れてない、使い方わかってないものがいくつかあるけど・・・(´・ω・`)