Monad クラスと Functor クラスや Applicative クラスの間に階層関係がないのは、本当に「歴史的理由」か?
base パッケージの Monad クラスと Functor クラス、Applicative クラスに階層関係がない理由
歴史的経緯はさておき、2012年11月現在、「Monad クラスが Functor クラスを継承したり、Applicative クラスを継承する形」になっていないのは、Haskell の標準言語仕様(Haskell 2010)や GHC の言語拡張に「スーパークラスに対するデフォルトのインスタンスを定義する機能」が用意されていないためです。
@tyatsuta いや、Functor => Monad になっていないのと同様に、(必ずスーパークラスのインスタンスを手書きで定義するのは面倒だという)design decision の問題です。 c.f. http://t.co/iyjUMoFQ
2011-12-22 23:22:25@tyatsuta で、この問題の解決策として、GHC にスーパークラスのデフォルトインスタンスを定義する機能を加えることが現在議論されているというわけです。 http://t.co/XbQkTb9E
2011-12-22 23:25:32Functor を Monad のスーパクラスとして階層化する場合,スーパークラスのインスタンスを定義する方法がないと死ぬぞ、っていうのは何度か出ている論点ですね。 http://j.mp/grLu7L http://j.mp/eaubma
2011-02-04 11:59:57いつも議論になっているように、スーパークラスのデフォルトメソッドやデフォルトインスタンスを定義する機能なしに階層構造を導入すると、互換性とか modularity の面でまずい結果になってしまいますし。 http://j.mp/ifpT4Y http://j.mp/i7KHe6
2011-01-05 20:30:18.。oO(それでいつも「スーパークラスのデフォルトメソッドやデフォルトインスタンスを定義する」機能はどんな文法にするべきかという議論が巻き起こってくるわけですが…… c.f. http://j.mp/grLu7L )
2011-01-05 20:33:05既にいくつか「スーパークラスのデフォルトのインスタンスを定義する機能」の案は出ているのですが、まだ実際に GHC の機能として実装されてはいない、というのが現在の状況です。
GHC Wiki に she に入っている「スーパークラスのデフォルトインスタンスを定義する機能」について提案するページが追加されました。 http://hackage.haskell.org/trac/ghc/wiki/DefaultSuperclassInstances
2011-03-10 09:59:11(使い勝手の関係上)これが入らない限り Functor f => Monad f、Functor f => Applicative f => Monad f という階層化はできないので、階層化して欲しいという方は要注目です。
2011-03-10 10:02:57もちろん、連載でも書いたように she を使えば「スーパークラスに対するデフォルトのインスタンスを定義する」ことができますが、she は外部のツールであり、GHC や Haskell Platform の機能の一部ではありません。
http://itpro.nikkeibp.co.jp/article/COLUMN/20120110/378061/?P=5&ST=ittrend
http://itpro.nikkeibp.co.jp/article/COLUMN/20120207/380292/?ST=ittrend&P=7
Applicative => Monad にすると壊れるコード
Haskell 1.3 以前の Functor クラスと Monad クラス
現在階層化するように変更できない理由はさておき、Functor クラスと Monad クラスが階層化されていないのは、(例えば Monad クラスの後に Functor クラスが提案されたというような)歴史的な理由によるものだと考える人が少なくないでしょう。
ただ、実際には、当初提案されていた Functor クラスと Monad クラスには階層関係がありました。歴史的な話を語るのなら、この階層関係のある形に提案されていた Functor クラスと Monad クラスが何らかの理由により階層関係を持たない形で Haskell 1.3 に取り入られた、という背景を抑えておく必要があると思います。
@SubaruG c.f. http://t.co/lMfZhhWA http://t.co/L2VkhVI3 http://t.co/C7pw0GRC
2012-10-08 01:14:27@SubaruG さっきのは、Monad クラスを入れるための機能の提案論文や Haskell 1.2 時代の Gofer には Functor と Monad の継承があったのに、1.3 では分かれて入ってしまった、という証拠の提示でした。なので、英文は読めなくても大丈夫です。
2012-10-08 01:28:36@SubaruG Haskell 1.3 制定の頃の議論を見てないので、残念ながら、その時にどういう判断で分けたのか正確なところは分かりません。
2012-10-08 01:20:56@SubaruG ただ、今現在 Functor クラスや Applicative クラス、Monad クラスを分けたままにしているのは、基底クラスのデフォルトのインスタンスを定義するための機能がまだ(標準や GHC)にないから、というのが強い理由になっています。
2012-10-08 01:23:00@mr_konn @SubaruG (あとで見つかったApplicativeはともかく、)Functorと Monadクラスは同じHaskell 1.3で入ってますね。(ちゃんとreturn = map f xs = xs >>= return . fであることも示されています)
2011-09-04 23:41:10「歴史的経緯」は現在でも強い理由の一つか?
Haskellのライブラリ、Scalazに比べると実装の都合とか歴史的理由の回避とか依存性減らすためとか「GHC拡張使う場合と使わない場合両方用意する」とかで、それぞれで内部で再発明してる場合がよくある感じがするんだが・・・
2012-11-20 17:41:39