Monad クラスと Functor クラスや Applicative クラスの間に階層関係がないのは、本当に「歴史的理由」か?

Functor クラスと Applicative クラス、Monad クラスが Functor => Applicative => Monad という階層構造になっていない理由として、よく歴史的な理由という説明が使われます。ですが、本当に歴史的な経緯が主な理由でそうなっているのでしょうか? 歴史的な経緯が事実だとしても、他にも強い理由が存在するのに歴史的な理由という説明によって覆い隠されていないでしょうか?
11

base パッケージの Monad クラスと Functor クラス、Applicative クラスに階層関係がない理由

歴史的経緯はさておき、2012年11月現在、「Monad クラスが Functor クラスを継承したり、Applicative クラスを継承する形」になっていないのは、Haskell の標準言語仕様(Haskell 2010)や GHC の言語拡張に「スーパークラスに対するデフォルトのインスタンスを定義する機能」が用意されていないためです。

shelarcy(しぇらーしぃ) @shelarcy

@tyatsuta いや、Functor => Monad になっていないのと同様に、(必ずスーパークラスのインスタンスを手書きで定義するのは面倒だという)design decision の問題です。 c.f. http://t.co/iyjUMoFQ

2011-12-22 23:22:25
shelarcy(しぇらーしぃ) @shelarcy

@tyatsuta で、この問題の解決策として、GHC にスーパークラスのデフォルトインスタンスを定義する機能を加えることが現在議論されているというわけです。 http://t.co/XbQkTb9E

2011-12-22 23:25:32
shelarcy(しぇらーしぃ) @shelarcy

Functor を Monad のスーパクラスとして階層化する場合,スーパークラスのインスタンスを定義する方法がないと死ぬぞ、っていうのは何度か出ている論点ですね。 http://j.mp/grLu7L http://j.mp/eaubma

2011-02-04 11:59:57
shelarcy(しぇらーしぃ) @shelarcy

いつも議論になっているように、スーパークラスのデフォルトメソッドやデフォルトインスタンスを定義する機能なしに階層構造を導入すると、互換性とか modularity の面でまずい結果になってしまいますし。 http://j.mp/ifpT4Y http://j.mp/i7KHe6

2011-01-05 20:30:18
shelarcy(しぇらーしぃ) @shelarcy

.。oO(それでいつも「スーパークラスのデフォルトメソッドやデフォルトインスタンスを定義する」機能はどんな文法にするべきかという議論が巻き起こってくるわけですが…… c.f. http://j.mp/grLu7L )

2011-01-05 20:33:05

既にいくつか「スーパークラスのデフォルトのインスタンスを定義する機能」の案は出ているのですが、まだ実際に GHC の機能として実装されてはいない、というのが現在の状況です。

shelarcy(しぇらーしぃ) @shelarcy

GHC Wiki に she に入っている「スーパークラスのデフォルトインスタンスを定義する機能」について提案するページが追加されました。 http://hackage.haskell.org/trac/ghc/wiki/DefaultSuperclassInstances

2011-03-10 09:59:11
shelarcy(しぇらーしぃ) @shelarcy

(使い勝手の関係上)これが入らない限り 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 にすると壊れるコード

K. Sakaguchi @pi8027

Applicative => Monad にすることによって壊れるパッケージって存在するんだろうか。

2012-11-21 23:59:05
K. Sakaguchi @pi8027

壊れる例をぱっと構成できないけれど、壊れるとなるとちょっと……という話ではある

2012-11-21 23:59:34
K. Sakaguchi @pi8027

いやインスタンス作る箇所でひっかかって普通に色々壊れるぞ。大変なことだ。

2012-11-22 00:00:02

Haskell 1.3 以前の Functor クラスと Monad クラス

現在階層化するように変更できない理由はさておき、Functor クラスと Monad クラスが階層化されていないのは、(例えば Monad クラスの後に Functor クラスが提案されたというような)歴史的な理由によるものだと考える人が少なくないでしょう。

ただ、実際には、当初提案されていた Functor クラスと Monad クラスには階層関係がありました。歴史的な話を語るのなら、この階層関係のある形に提案されていた Functor クラスと Monad クラスが何らかの理由により階層関係を持たない形で Haskell 1.3 に取り入られた、という背景を抑えておく必要があると思います。

shelarcy(しぇらーしぃ) @shelarcy

@SubaruG さっきのは、Monad クラスを入れるための機能の提案論文や Haskell 1.2 時代の Gofer には Functor と Monad の継承があったのに、1.3 では分かれて入ってしまった、という証拠の提示でした。なので、英文は読めなくても大丈夫です。

2012-10-08 01:28:36
shelarcy(しぇらーしぃ) @shelarcy

@SubaruG Haskell 1.3 制定の頃の議論を見てないので、残念ながら、その時にどういう判断で分けたのか正確なところは分かりません。

2012-10-08 01:20:56
shelarcy(しぇらーしぃ) @shelarcy

@SubaruG ただ、今現在 Functor クラスや Applicative クラス、Monad クラスを分けたままにしているのは、基底クラスのデフォルトのインスタンスを定義するための機能がまだ(標準や GHC)にないから、というのが強い理由になっています。

2012-10-08 01:23:00
shelarcy(しぇらーしぃ) @shelarcy

@mr_konn @SubaruG (あとで見つかったApplicativeはともかく、)Functorと Monadクラスは同じHaskell 1.3で入ってますね。(ちゃんとreturn = map f xs = xs >>= return . fであることも示されています)

2011-09-04 23:41:10

「歴史的経緯」は現在でも強い理由の一つか?

Kenji Yoshida @xuwei_k

Haskellのライブラリ、Scalazに比べると実装の都合とか歴史的理由の回避とか依存性減らすためとか「GHC拡張使う場合と使わない場合両方用意する」とかで、それぞれで内部で再発明してる場合がよくある感じがするんだが・・・

2012-11-20 17:41:39