Soft Typingに対するMatzの誤解とDuck TypingとStructural Subtyping

まつもとゆきひろさん(Matzさん)がRubyKaigi2016の基調講演で説明した、Ruby 3のSoft Typingにまつわる誤解や構造的部分型に関する話です。
18
amaya💤 @amaya382

soft typing よく知らないけど structural subtyping 的なアレか?

2016-09-09 00:36:40
Kota Mizushima (on a diet) @kmizu

@esumii @yukihiro_matz structural subtyping + type inferenceで実現されたものが従来duck typingといっていたものにかなり近い、とはいえると思います。その実現例の一つがOCamlになるのではないかと。

2016-09-09 02:29:44
Kota Mizushima (on a diet) @kmizu

@yukihiro_matz 具体例: # let f x = x#to_i;; val f : < to_i : 'a; .. > -> 'a = <fun> これで、fはto_iというメソッドを持ったxのみを引数に取る関数、になります。それが*型推論*されます。

2016-09-09 02:32:09
Yukihiro Matzmotto @yukihiro_matz

@kmizu 140文字では書ききれないでしょうが、この「型推論されます」は関数fの呼び出し側でということですよね。心情としては< to_i : 'a; .. >の部分を書きたくない(推論してほしい)のですが。

2016-09-09 02:37:09
Kota Mizushima (on a diet) @kmizu

@yukihiro_matz あ、いえ。関数fの定義側で、ということです。

2016-09-09 02:43:17
Kota Mizushima (on a diet) @kmizu

@yukihiro_matz val f: ... の部分はOCaml処理系が型推論した結果です。ユーザが書く必要のある部分は、 let f x = x#to_i ;; の部分のみです。

2016-09-09 02:43:57
Kota Mizushima (on a diet) @kmizu

@yukihiro_matz 連投になって申し訳ないですが、利用するときは、 class o = object(self) method to_i = 100 end;; みたいにto_iを持つクラスを作ってやって、f(new o);; でOKです。

2016-09-09 02:45:38
S (ツイートはスレッド全体をご確認ください) @esumii

@kmizu @yukihiro_matz クラス作らなくてもf (object method to_i = 100 end)でも行けます。さきほどの記事 itpro.nikkeibp.co.jp/article/COLUMN… のとおりです。横からすみません。

2016-09-09 02:48:24
Kota Mizushima (on a diet) @kmizu

@esumii @yukihiro_matz あ、そうですね。補足ありがとうございます(実はobject構文を忘れていて、構文エラーになったので仕方なくclass作ったのでした…)

2016-09-09 02:50:30
シロクロつけるパンダ @applideveloper

静的言語のTypescript の Structural Subtyping は 静的にチェックできるダックタイピング と捉える事ができる。これで柔軟性は失われないのでは? by @tell_k on @Qiita qiita.com/tell-k/items/1…

2016-09-09 02:46:16
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz

いやー、ダックタイピングできなくなるって言うので、Structural Subtypingがかなり近いのに、Structural Subtypingが不満なのかな?Matzは....

2016-09-09 02:57:15
はなだ☆のぶかず@lisp &ボドゲ勢ボドゲプレイヤー) @nobkz

別にダックタイピングは、そのStructural Subtypingが凄く近いと思うんだが、なにが違うんだろうかね?

2016-09-09 02:58:42
シロクロつけるパンダ @applideveloper

ScalaやTypeScriptのStructural Subtypingは 静的にチェックできるダックタイピングと捉えると静的言語でダックタイピングができなくはなく、柔軟性が損なわれないのでは?#rubykaigi qiita.com/tacke_jp/items…

2016-09-09 03:01:42
Kota Mizushima (on a diet) @kmizu

今調べていて知ったのですが、Haxeもstructural subtyping + type inferenceしてくれるのですね。 function foo(pt){ return pt.x; } foo({x: 100}) // OK foo{{y: 100}) // NG

2016-09-09 03:04:09
S (ツイートはスレッド全体をご確認ください) @esumii

OCamlのstructural subtypingは1997年に研究室配属されて最初のサーベイで取り上げたら「多相レコードはO堀先生とかRemyとか前からあるけど研究として何が新しいの?」と突っ込まれた(おそらく特に新しくない)

2016-09-09 08:29:20
S (ツイートはスレッド全体をご確認ください) @esumii

OCaml同様、型を(インターフェースも)全く書かなくてもオブジェクト(レコード)のduck typing的な型推論ができるSML# は1993年からある

2016-09-09 08:57:42
Kota Mizushima (on a diet) @kmizu

昨日は色々書きましたが、自分としては、数十年前からある(研究/実用)の話がRubyの未来に役立つなら凄く良い話だと思うので、Matz氏がOCamlを勉強するなら凄く良いのではないかとは思う。一から同じようなのを再発明すると同じようなポイントでつまづくだけな気がするというか…。

2016-09-09 03:08:13
Kota Mizushima (on a diet) @kmizu

コレクションに同一構造の型を突っ込もうとするとアップキャストが必要になる点など(住井先生の記事参照: itpro.nikkeibp.co.jp/article/COLUMN…) 全て同じとはいかないですが

2016-09-09 03:09:41
Kota Mizushima (on a diet) @kmizu

型推論によってRubyサブセットをカバーして、残りを従来の動的型検査で処理するという考えなら(これは2014くらいの発表に対する話で昨日のとはずれがあるかもですが)、OCamlのようなシステムで推論される範囲を知っとくのは有意義だと思うのです。

2016-09-09 03:11:20
Kota Mizushima (on a diet) @kmizu

自分はリアルタイムでダック・タイピング言い出された時代のこと覚えてるから言うけど、あれはLL(Scripting Language)サイドの人たちが、明示的な継承に基づくサブタイピング(nominal subtyping)との対比として使ってたのが初期の用法のはずなのですよ。

2016-09-09 04:07:55
Kota Mizushima (on a diet) @kmizu

で、ダック・タイピング言い出した人たちがstructural subtypingの知識があったかというとたぶんなかったと思っている。

2016-09-09 04:08:18
Kota Mizushima (on a diet) @kmizu

歴史的には、ちょうどスクリプト言語がはやり始めた時期、静的型システムとはJavaのように窮屈なものだとするような誤解がまかり通ってたということがあって、いやそれはJavaとかの問題であって静的型システム一般の問題では必ずしもないのだよという声はあまり届かなかったなあ…と

2016-09-09 04:10:11
Kota Mizushima (on a diet) @kmizu

で、最近になって静的型システムも色々進歩してることが認められて、それに伴って復権してるという流れがあるのではないかと。

2016-09-09 04:10:46
Kota Mizushima (on a diet) @kmizu

もちろん、その「進歩」は最近に起こったものではなく、もっと前からあったものではあるのだけど。

2016-09-09 04:11:12