型クラスに関するここ数日の議論
![](https://s.togetter.com/static/web/img/placeholder.gif)
「型クラスはオブジェクト指向におけるインターフェイスみたいなもの」って良く言いますが、「みたいなもの」って言っているようにもちろん正確ではないものの、方便としてはまったく悪くないと思います。コードを書きながら学んでいる分には、特に混乱を招くということもないと思います
2017-05-24 00:41:32![](https://s.togetter.com/static/web/img/placeholder.gif)
ただ、コードを書かずにその辺のブログやウィキペディアの記述をレポートにまとめるだけのような学び方だと、まったく明後日の誤解にたどり着きそうです。型クラスは『インターフェイス』よりも強力なのですが、『インターフェイス』があれば型クラスは要らないなどと考えちゃう人もいるかもです
2017-05-24 00:44:49![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスが何なのか知りたい人は、PureScriptのコンパイル後に出力されたJavaScriptコードを覗いてみるのもいいと思います。拍子抜けするほど簡単です
2017-05-24 00:52:26![](https://s.togetter.com/static/web/img/placeholder.gif)
僕の場合、型クラスを理解したと思えたのはAPLASのトークを聞いていた瞬間だった。仮説としては「本当に良くわかっている人の話を聞けば理解できる」と「しつこく考え続けていればいつかは理解できる」の二つがあって、まーどっちにしても救いがあるような無いようななんとも言えない感じ。
2017-05-24 02:02:35![](https://s.togetter.com/static/web/img/placeholder.gif)
OOPに例えれば理解できるかというと、悲観的かな。僕は、「型クラスを理解した人は、インタフェースとの類似性を理解できる」という逆方向の関連しかない気がする。
2017-05-24 02:03:48![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラス 理解してしまえば、本当に簡単で便利で素晴らしいものなんだけど、理解するまでは結構かかった覚えがある。 しかし、理解したときのことは覚えていない… 気づいたら理解してたんだよなぁ…
2017-05-24 04:27:42![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスをOrderingを用いて説明してみる - kmizuの日記 kmizu.hatenablog.com/entry/2017/05/…
2017-05-24 06:00:02![](https://s.togetter.com/static/web/img/placeholder.gif)
@soutaro OOPにたとえると理解できるかは自分も疑問ですが、ただ、OOP言語の要素で的確に型クラスをエンコードできる(型から辞書を引っ張ってくる部分は、新しく理解が必要ですが)のも確かであり、 ( lampwww.epfl.ch/~odersky/talks… の p.14辺り)
2017-05-24 06:20:56![](https://s.togetter.com/static/web/img/placeholder.gif)
@soutaro OOP言語を使った直接的なエンコーディングを理解することで、型クラス自体も理解しやすくなると思っていて、その意味ではOOPの要素の援用も利点はあると思います(説明の仕方によりますが)
2017-05-24 06:26:34![](https://s.togetter.com/static/web/img/placeholder.gif)
昨日と違った視点で、型クラスとインタフェースを直接比較することの害を考えてみると、Scalaにおけるエンコーディングみればわかりますけど、対応関係をつけるのにはインタフェースは要らなくて、(多重継承可能な)クラスがあれば十分なのですよね
2017-05-24 06:30:08![](https://s.togetter.com/static/web/img/placeholder.gif)
アルゴリズムW の実装は、アルゴリズミックな推論規則を作ることで劇的に簡単になり、Prologで実装すればわずか数行で実装できるので、型クラスもアルゴリズミックな推論規則があれば、おそらくわずか数行、数十行でかけるはずだと思うんだなぁ。
2017-05-24 06:54:01![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスどういうふうに盛り上がってるのかよくわかってないけど、個人的にはECOOP 2009でSimon Peyton Jonesのtalkを聞いたときに、vtableの静的バージョンとおもうとしっくりくるなぁ、とおもったのでした。
2017-05-24 08:51:42![](https://s.togetter.com/static/web/img/placeholder.gif)
@kmizu コレクションの要素がNumericを実装していればsum自体は実装できますね。 複数のNumericを使い分けたいというのであれば「文脈によって同じ型に対する型クラスのインスタンスを使い分けたい場面」に相当するので私も型クラスでないとできないと思います。
2017-05-24 08:55:47![](https://s.togetter.com/static/web/img/placeholder.gif)
@kmizu 「「定義を」分離できるのが型クラスの一番の利点」と言っているのでその点は私はインターフェースでは難しいと思ってます。
2017-05-24 08:59:21![](https://s.togetter.com/static/web/img/placeholder.gif)
@blackenedgold これは、特定の要素型Tがあったとして、実際にT型のオブジェクトが存在しなくても、型クラスが使える、という話ですが、この点についても、インタフェースを実装するという場合、困難というか無理な話になるのではないでしょうか。
2017-05-24 09:04:01![](https://s.togetter.com/static/web/img/placeholder.gif)
@blackenedgold ただ、型クラスだったら、オブジェクトが存在しない場合に特定の動作をするという側面も、「定義の分離」も単一の仕組みで実現可能のに対して、T.zeroみたいな、クラスメソッドを型からひっぱる仕組みだと片方の要求だけ満たすのが弱い部分かなと思いました。
2017-05-24 09:15:15![](https://s.togetter.com/static/web/img/placeholder.gif)
@h_sakurai 型クラスに関する推論は、たぶん主に二つあって、一つは型注釈無しのプログラムから型クラスの制約を含む型推論をするという部分、もうひとつは、型から対応する辞書をひっぱってくる部分、があると思うのですが、主に後者の話されてますか?
2017-05-24 09:38:08![](https://s.togetter.com/static/web/img/placeholder.gif)
@h_sakurai 型推論がない、あるいは弱い言語での型クラスは、前者があまりなさそうなので、後者の話かとは思っていますが。
2017-05-24 09:39:15![](https://s.togetter.com/static/web/img/placeholder.gif)
@kmizu 型推論しつつ、変換を両方同時にできるようなので、それを簡潔なコードで示したいんですね。推論してから変換はより複雑なようなので。というか、型クラスなしのオーバーロードもわからないし、型クラスやアドホック多相が全般的に簡単な実装例が少ないと思います。
2017-05-24 09:43:23![](https://s.togetter.com/static/web/img/placeholder.gif)
@h_sakurai なるほど。型クラスなしのただのオーバーロードは(サブタイプなければ)とても簡単です。名前 -> [関数のシグニチャ] みたいなMapをもっておいて、シグニチャリストのどれかにマッチするか判定すればいいだけなので。
2017-05-24 09:49:53![](https://s.togetter.com/static/web/img/placeholder.gif)
@ababupdownba Rubyの時はオープンクラスで後付けでメソッド追加簡単にできてたけどそれは避けるべき行為だと認識してたんですが型クラスとかでやってることってそれとあまり変わらないなと思って。後者は自分でも気にしてなかったので自分の考えが矛盾したなと。濫用はすべきではないと思いますが。
2017-05-24 09:56:05