型クラスに関するここ数日の議論
![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラス、もちださんと一緒で名にこの頭痛が痛いみたいなやつって感想だったしググってもアドホック多相を実現するものとか言う分かってるやつ以外に説明する気が全くない記事ばかりで界隈のハードさを感じたものです。
2017-05-23 10:38:43![](https://s.togetter.com/static/web/img/placeholder.gif)
@daisuke_m 型クラスもJavaのinterfaceもモチベーションとしては複数のデータ型に共通の振る舞いを持たせたい、というものです で、共通の振る舞いの各型毎の実装方法が interface -> implementsする 型クラス -> newしてインスタンスを定義する という感じです
2017-05-23 10:40:21![](https://s.togetter.com/static/web/img/placeholder.gif)
Haskellの型クラスインスタンスはファーストクラスオブジェクトではないけど、Scalaの場合は普通のクラス-インスタンスにマッピングされるから型クラスインスタンスも普通のインスタンスと同じものになってファーストクラスとして扱えちゃうので余計混乱しやすい感はある
2017-05-23 10:44:02![](https://s.togetter.com/static/web/img/placeholder.gif)
@ruimo JavaのOOに例えると、型クラスはinterfaceみたいなものと思って良いような気がします。
2017-05-23 10:47:31![](https://s.togetter.com/static/web/img/placeholder.gif)
集合の性質とか一つの側面を抽象化して定義するという意味で、型クラスはとても便利だと思う。集合そのものの抽象化(スーパークラス)、具体化(サブクラス)ではなく、「この集合はこの定義において順序集合とみなせる」というOrderingの定義が面白い。
2017-05-23 10:49:07![](https://s.togetter.com/static/web/img/placeholder.gif)
Strategyパターン分かってる人向けに、実用的な面だけで言うなら、型クラスは(Strategyの実装クラスのインスタンスが自動的に与えられる)Strategyパターンです。
2017-05-23 11:01:01![](https://s.togetter.com/static/web/img/placeholder.gif)
クラスベースOOPの多相は基本的にクラスやインターフェースによるサブタイピングでやる。広く使われてるとはいえ、LSPを守るのはプログラマの責任だったり、共変反変がややこしかったり、いろいろつらみはある。型クラスは型じゃないので、サブタイピングのつらみはない。(別のつらみはある)
2017-05-23 11:14:04![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスって何?→インタフェースみたいなもんだよ→ファンクタって何?→型クラスの一種だよ→つまりファンクタはファンクタインタフェースだよ→どんなインタフェースなの?→mapってメソッドがあることを約束するやつだよ
2017-05-23 11:23:05![](https://s.togetter.com/static/web/img/placeholder.gif)
(HaskellやScalaの)型クラスが後付け可能なのはたしかに便利だけど、型クラス特有の性質というわけじゃない。オープンクラスなOOPで、既存のクラスに後付けでインターフェースを実装したりとか、ないわけじゃない
2017-05-23 11:27:55![](https://s.togetter.com/static/web/img/placeholder.gif)
"今日も型クラスがない言語でプログラム書いて仕事しないといけないのに型クラスで盛り上がってるみなさん" という怒りを買いそうなフレーズ思いついたのでご自由にお使いください
2017-05-23 11:50:44![](https://s.togetter.com/static/web/img/placeholder.gif)
List[A]において"Aが 比較可能、シリアライズ可能 etc"のときに List[A] 自体も "比較可能、シリアライズ可能 etc" (逆にAがそうでなければList[A]もそうではない) みたいな型クラスの利点の話があまり出てきてない(Javaの継承だと単純には不可能?)
2017-05-23 11:56:17![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラスが嬉しいのかアドホックタ相が嬉しいのか。Scalaで、ある型クラスのインスタンスの一覧とりたい時どうするんだろう。IDEA頼り?
2017-05-23 11:57:21![](https://s.togetter.com/static/web/img/placeholder.gif)
間違ってたら突っ込んで欲しいのだけど、型クラスは「(オブジェクト指向ではなく)データ指向で考える」という思想とセットである気はする。むろん、互いに(ある程度までは)エミュレートはできるのだけど。 twitter.com/matarillo/stat…
2017-05-23 12:01:44![](https://s.togetter.com/static/web/img/placeholder.gif)
@nagise そうですね。というかさっきの自分の2つのtweetが誤解を招く言い方だったんですが "継承だと実質不可能(?)" "Javaでも継承使わず、型クラスのインスタンスを明示的に渡していく方式なら不可能ではないが、とても面倒" がより正しいというか言いたかったことですね
2017-05-23 12:21:24![](https://s.togetter.com/static/web/img/placeholder.gif)
Swiftはクラスの型変数が特定の条件を満たしている時だけ呼べるメソッドを後付けで定義できる(例えば数値の配列だけsumが呼べるとかできる)のと、型変数の静的メンバを呼べるので、型クラス的なことができる。 developer.apple.com/library/conten…
2017-05-23 12:38:55![](https://s.togetter.com/static/web/img/placeholder.gif)
個人的には Scala の Implicit Parameters を「型クラス」だと捉える向きに違和感を覚える。初心者に説明するための便宜としては良いかもしれないけど、型の情報から証明探索によって実装を自動導出するという重要な考え方を限定してしまうのではないかと思う
2017-05-23 12:45:59![](https://s.togetter.com/static/web/img/placeholder.gif)
型クラス はある型 もしくは 複数の型があるプロトコルを実装することで、同じ性質をもつものと分類する機能だと思うので、インターフェースのすごいやつぐらいの認識でいい気がしているけど、正しい理解かは知らない。
2017-05-23 13:02:43![](https://s.togetter.com/static/web/img/placeholder.gif)
@m2ym まず、事実として、Scalaのimplicit parameterは型クラスをオブジェクト指向言語に自然に導入するための機能で、とらえるというか、「型クラスそのもの」です。違うのは、辞書渡しが表のシグネチャとして見えるところでしょうか。
2017-05-23 14:14:06