@gakuzzzz Kotlinは複雑じゃないScalaを目指して作られたはずなので、複雑さをかなり増す(それに見合った表現力は得られると思うわけですが)型クラスは嫌ったんじゃないですかね。Scalaのimplicitより良い形で型クラス実現してくれればよかったと思いますが
2015-09-24 18:38:13型クラスは基本的に一つの型に対して一個しか定義できないので、Monoid とか Applicative とか一つの型に複数の定義が可能なものに対して、無理やり別の型を定義して現実回してるのは違和感があって、この辺もっとすっきり解決する方法は無いものか……と思っている
2015-09-24 18:46:10@gakuzzzz 型クラスのインスタンスがglobalなせいで一つの型につき一つしか定義できないのは(かつての)Haskellの制約であって、そこは後発であるScalaが(localにimportすることで型クラスインスタンスを導入する)クリアした部分では?と思うわけですが…。
2015-09-24 18:49:22Scalaのimplicitsに関して思うことは、やはり型クラスのインスタンス(implicitな値)の探索スコープが広すぎるというところにつきる。この辺のルールをもう少し厳しくすればコンパイル速度に寄与できんかな…evernote.com/shard/s29/sh/2…
2015-09-24 18:57:37Scalaz が何故このアプローチを取らなかったんだろう? twitter.com/kmizu/status/6… ライブラリ利用側に負担がでかくなるからかな?
2015-09-24 19:12:38@gakuzzzz @kmizu 今からでも個別インポートしたら一個ずつインポートできるように互換性を保ったまま調整できないものでしょか?Scalaz._に一個一個入れるのはさすがに大変な量ですかね?
2015-09-24 19:21:15@gakuzzzz そこらへんの解説はコミッタの方に期待することとして(ぇ、型クラスのインスタンスを個別にimportするのだと面倒くさいのを嫌ったのかなと個人的には思っています。
2015-09-24 19:21:51.@gakuzzzz @kmizu そのあたりに関してekmettせんせーが具体的にScalaコードも出して言及してる動画(15:00〜20:00 くらい)があるので参考までに youtu.be/hIZxTQP1ifo?t=… pic.twitter.com/IMcCdOwWhL
2015-09-24 19:43:48@cocoa_ruto Monoid[T]のインスタンスとして、SumMonoid extends Monoid[Int]とMultMonoid extends Monoid[Int]が同時に存在してるとなにかいけないことが発生する?とかそういう話?
2015-09-24 19:58:20@kmizu 例えば探索木による不変な集合を実装したSetがあったとして、Set Foo同士を連結しようとしたときに、そのふたつが同じインスタンス宣言に基づくものであるか保証できないと、効率よく連結できない。効率悪いならともかく、一般にはプログラムの動作を保証できなくなる。
2015-09-24 19:59:02@cocoa_ruto 保証はされるのでは?def add[T](a: Set[T], b: Set[T])(implicit sets: Sets[T]): Set[T] = ???(setsを使う) で、setsのインスタンスは同じ呼び出し元の元でuniqueだよね。
2015-09-24 20:07:30@cocoa_ruto 確かに、自分の提示した例だとそういうケースで部分木の共有ができなくなるとは思うけど、部分木の共有ができるときは効率が良ければ十分なのでは?(共有できるようにするには提示した定義を書き換える必要はあるが)
2015-09-24 20:13:13@cocoa_ruto 型クラスの(変な)インスタンスを選んでしまうと効率が悪くなるけど、別のインスタンスを選べば十分に効率が良いように定義すればそれでいいのでは?というのが自分の考え。
2015-09-24 20:14:44@cocoa_ruto 保たれるべきcoherenceは個々の型クラスごとに、作成者はわかってるはずなのでそれを書けばよくて、保たなかった場合の動作は言うように未定義動作でいいと思っている。
2015-09-24 20:24:17