型クラスに関するここ数日の議論
![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
まあ、そういうアナロジーに反発を覚えるのは、型クラスをインターフェースだとする抽象化では、自分のやりたいことが実現できないだろうとコードを書きながら感じていたというのが大きそうではある
2017-05-23 22:02:09![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@blackenedgold 同じ型に対する型クラスのインスタンスを使い分けられるってのはScalaとかの実装ではデフォルトでそうなるよねってだけであって、少なくともオリジナルの提案ではglobalにひとつに決まります。複数選べる拡張というのはありますが。
2017-05-23 22:02:22![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@kmizu ちょっと文脈のある発言なので返しづらいのですが、ひとまず存じております。 Javaのinterfaceと辞書渡しの型クラスの実装で実装上の長短がほとんどないという文脈でした。辞書渡しの利点の可能性としてインスタンスの使い分けがあるけどそれもあまりないという意図でした。
2017-05-23 22:09:45![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
「型クラスは難しい」はOOPのパラダイムが支配的になっている人にとってはそうだろうけど、一方でそうでない人にとっては難しくないのでは、という疑問がある。ただ、現実にメインストリームの言語がほとんどOOPLであるので、その経験をせず型クラスを理解した人、というサンプルを探すことが
2017-05-23 23:00:23![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
かなり難しい作業なので、現実主義的には、「型クラスは難しい」と思ってもらって頑張って理解してもらうしかなかろうと思っている。
2017-05-23 23:01:10![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
「型クラスは実は難しくないのでは」という話は、特定の手法に慣れた後、距離がある別の手法を理解するのは、たとえ複雑でなくとも、難しいと感じるだろうという話。より正確には、型クラスはさほど複雑でないが、多くのユーザがOOPに染まっているので、「難しく感じられてる」のだろうと。
2017-05-23 23:06:31![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida そこは結構微妙で、Scalaのimplicit parameterは型クラスの「ために」作られた機能であることは過去のScala設計者の発表資料から明らかであるのですが、元々オブジェクト指向言語的な機能でない型クラスをオブジェクト指向言語にもってくるのにどうしようと考えて
2017-05-23 23:17:06![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida 型クラスとそのインスタンスの定義は、classあるいはtraitと、それらの実際のインスタンスで使いまわして、型からアルゴリズムを推論する部分だけ実装しよう、というものなのですね。だから、idiomであるというのも正しくないのです。
2017-05-23 23:18:25![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida 型クラスを、Haskell等における特定の言語機能でなく、もうちょっと抽象的な概念としてとらえなおした上で、それのScala流実装がimplicit parameterである、という感じです。わかりにくかったらすいません。
2017-05-23 23:19:14![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
型クラスが難しいんじゃなくて、より低レベルな概念であるところのimplicit parameterが難しいのでは。知らんけど。全ての値が参照でも難しくないけどポインタは難しいみたいな。
2017-05-23 23:22:59![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@kmizu Scala 設計者の気持ちとしては、型クラスは言語機能の一部ということでしょうかね。僕はてっきり Scala の型クラスとしての implicit parameter は誰か賢いユーザが発明したんだと思っていました。
2017-05-23 23:27:21![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
型クラスの実装の難しさは、C言語でポインタ使ってオブジェクト指向やれるのは分かるけど、C++つかえばいい。簡単だ。実装だってそんなに難しくない。というより難しいし、パーサコンビネータより難しいと思うんだなぁ。 LLのパーサジェネレータレベルに難しい。
2017-05-23 23:27:49![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
Yaccを作るのは難しいっていうくらい、型クラスを作るのは難しいって思うんだなぁ。 Yaccなんて簡単だといって、大堀先生のPDF読めば分かるって言われても難しいよやっぱりw
2017-05-23 23:29:23![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
型クラスについて色々調べてたけど、ところによって言ってることが違う(というより、日本語として適切な言い回しが色々ある)からまとめるのに時間かかってしまった…
2017-05-23 23:32:57![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida 実際にはどうかというと、研究者界隈での発表では、Poor Man's Type Classesという自虐的な(笑)タイトルの発表で、型クラスをこんなふうに導入してみたぜ!という発表をしています lampwww.epfl.ch/~odersky/talks… 2006年ですからかなり初期の話です
2017-05-23 23:43:48![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida ちなみに、Scalaの設計者のOderskyは型クラス自体も研究対象にしていた時期があり、型クラスの実装も知っているので、影響を受けて似たものを作った、のではなく、明確に型クラスを導入するのだという意識があったはずです(資料みるとわかりますが)
2017-05-23 23:46:05![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida 一方で、Odersky氏は、研究者向けと普通の言語ユーザ向けで割と言葉選びを変えてる節があって、implicit parameterと型クラスの関係について、一般ユーザ向けに発言したものは初期はなかったと思います。型クラスというと小難しいと思われることを嫌ったのかもしれません。
2017-05-23 23:47:33![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida ただ、どっかの時期を境に、型クラスとして利用したライブラリが増えていきます。過去の発表資料を発掘されてバレたのか、どっかのオフラインの会合で明確にそう発言したのか、ユーザが勝手に「再発見」したのか、いずれなのかはわかりません。
2017-05-23 23:50:45![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@t_uchida 結果としては、当初の意図通り、つまり型クラスとして使われる例が一般的になってきたということくらいしかわからないですが。
2017-05-23 23:51:31![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
思えば静的型付言語知らない人には、ジェエリクスの境界値パラメータ以上にわけわからん機能だろうなぁとは思う。型に後で振る舞い追加するための実装できるなんて未知の技術過ぎるよなぁ。便利なのだけど。 / “型クラスの真の力を見せる -…” htn.to/kQsAAQVLoWP
2017-05-24 00:01:12![](https://tgfile.tg-static.com/static/web/img/placeholder.gif)
@kmizu とても興味深いです。Haskell とその言語機能のひとつである型クラスが知られるようになってきたので、Scala ユーザも本来の implicit parameter の使い方に移行していったのかも知れないと思いました。
2017-05-24 00:01:25