Scalaz 6.0.4 と Haskell (GHC7.4.1) を比べてみることによってScalazのclassを分類して理解してみる

追記:
この記事書いたあとのtwitter上での反応 ScalazとHaskellの比較記事というか疑問点をいっぱい書いたら、shelarcyさんにいっぱい教えておもらったよ!



Scalaz7 では色々改善されている部分もあるけれど、まだ作りかけなので、とりあえずScalaz6.0.4で。自分のHaskellの知識が浅く、間違ってること言っている可能性大なので、なにかあればどんどん突っ込んでくださいm(_ _)m

  • Scalazの場合Bifunctorというものがあるが、Haskellにbifunctorという単語がでてこない
  • ほかにも、(monadやkleisliはでてくるのに)Comonad, Cokleisli という単語もでてこない? (このあたりの理由が理解できていないので誰か教えて!)
    • Haskellの場合必要ないのか?
    • Scalaz6.0.4 と Haskell(GHC7.4.1) で構造が違う?
  • 遅延評価を考えると、ScalaのListがHaskellのListに直接対応しなくて、ScalaとScalazで関連するclassが大量になってしまう・・・
  • Option ,List などの数種類に関しては、OptionT OptionW ListT ListW など拡張のためのclassが複数あるのでそのあたりも見ないといけない
  • Scalaz6.0.4の場合、データ構造だろうが type class だろうが、ほとんど全部scalaz配下に置いてあるけれど、Haskellの場合ある程度Data ,Controlなどに分かれてる。このあたりの分け方は全然異なるので、対応するものを探すのがめんどくさい。どちらかというと、Haskellのほうが一つのファイルあたりのコード量がおおくて、Scalazのほうは、細かく分けてる?
  • Scalazの場合、おそらくできるだけカッコを使わずに済むように書けるように*1するため、IdentitiyMAMAB というものがあって、これに慣れないとどこに定義があるのかわかりにくい。 => Identityについては、恒等MonadというものでHaskellにもあるみたいですね
  • その他Scalazにあるけど、Haskell側になさそうなものというか、とにかく対応がよくわかってないtype classっぽいものを列挙。*3Pointed,Apply,Bindあたりに関しては、Scalazのほうが、MonadやApplicativeの部品を細かく分けて定義して組立てているという感じだろうか?
  • Scalazにある、型クラスでもないし、type levelな計算に使えるわけでもない、個人的に嬉しさがよくわからないもの
  • データ構造
    • BKTree コメントにリンクがあるように、Haskellのものをportingしたか参考にして作った感じ
    • FingerTree
    • ImmutableArray Arrayをwrapして要素を変更するような操作をできないようにしたり、ちょっと便利メソッドがあるだけで大したことはしていないみたい
    • Heap これもコメントに " Based on the heaps Haskell library by Edward Kmett" って書いてある
    • Tree データ構造っていう分類でいいのかな?
  • Each Functorと大体同じ形だけれども、結果がいらなくて副作用起こしたい際につかうっぽい。なので、Haskellに直接対応するものないみたい
  • Forall これに関しては、Haskellで言語レベルでサポートされているものを、Scalaでエミュレートするために用意されているらしい。この記事が素晴らしいのでみんな読みましょう。
  • Liskov とりあえずHaskellに対応するもの見つけられなかった*4し、type classでもなさそうだし、そもそもなんなのか全くわかってないのでだれか教えて!
  • HaskellValidationない。これ読んで気がついたけれど、Monadとしてのinstanceの表現のやりかたを変えれば*5、EitherとValidationという、似たようなものをわざわざ(scalaの文法としての)classやtraitとして表現する必然性はなく、*6どちらか一方でいいのはないか? Validationの場合nonEmptyListとしてaccumulateするショートカットが用意されていたり、ちょっとだけ便利にはなっているけど・・・。それに関連して、こんなこと があるけれど、これも明らかに似ている気がするんだけれども、どうなんだろう・・・(例外処理に関する便利メソッドがくっついているだけで、大まかにみればEitherもしくはValidationと同型?)

これでもまだ、 scalaz core でHaskellで直接対応するものがあるわけではない、かつまだ触れてない、使い方わかってないものがいくつかあるけど・・・(´・ω・`)

*1:勿論Haskellに直接対応するものなんてない

*2:うまく説明できるほどにはちゃんと理解できてない・・・(´・ω・`)

*3:実は自分が見つけられてないだけで同じというか似たようなものが存在するのか、そもそも必要ないのかそのあたりよく理解できてない。

*4: grepした程度・・・

*5:Optionのmonoidとしてのinstanceが複数ありえるように、EitherのMonadとしてのinstanceが複数という感じ?

*6:間違ってたらだれかつっこんで!