関数型言語を作ろう!あるいはRubyistのための型推論入門 #rubykaigi 2015 #rubykaigiB

Let's make a functional language! @yhara http://rubykaigi.org/2015/presentations/yhara
1
黒曜@Leaner Technologies @kokuyouwind

UnificationでのTypingの話。型システム入門読んでるとこの辺はわかりやすい感じ。 amazon.co.jp/gp/product/427… #rubykaigi #rubykaigiB

2015-12-13 16:19:01
よしこ @yoshiko_pg

twitter.com/yoshiko_pg/sta… #rubykaigi #rubykaigiB

2015-12-13 16:20:27
よしこ @yoshiko_pg

f = fn(x){ is_odd(x) } is_odd :: Number -> Bool f :: (1) -> (2) x :: (3) 1と3は等しい 3はNumberで2はBoolであることがわかるので、 f :: Number -> Bool が確定する

2015-12-13 16:20:14
黒曜@Leaner Technologies @kokuyouwind

実装の話。Parse, Type check, Executeの3ステップで実行する。説明の都合上1,3,2の順で説明する。 #rubykaigi #rubykaigiB

2015-12-13 16:22:01
よしこ @yoshiko_pg

型推論の処理は、まずParse。コードを構文木に変換する Rubyではracc gemとかでできる #rubykaigi #rubykaigiB

2015-12-13 16:23:02
黒曜@Leaner Technologies @kokuyouwind

RubyだとParserに何使うんだろうと思ったら、gemがいろいろあるのね。今回はracc gemを使ってるとのこと。lexとparseは分かれずに、charをそのままトークンとして文法を定義するのか。 #rubykaigi #rubykaigiB

2015-12-13 16:23:43
よしこ @yoshiko_pg

Rubyで木構造を扱うときはネストした配列として扱うのが楽 Parseできたら、木構造の上から順に実行(Eval)する #rubykaigi #rubykaigiB

2015-12-13 16:24:39
マスタカ @masutaka

racc gem で比較的簡単に木構造にできる。まさに S 式 #rubykaigi #rubykaigiB

2015-12-13 16:24:44
黒曜@Leaner Technologies @kokuyouwind

パース後はシンボルのリストになる。実行のところを聞き逃したけど、まぁリストだしよしなに実装するんだろう。規模が大きくなったら構文要素ごとにクラスに分けて、クラスごとにeval持つ感じになるのかな。 #rubykaigi #rubykaigiB

2015-12-13 16:26:13
かるぱねるら @karupanerura

identity = fn(x) { x } みたいな奴はどう推論するのだろう。 #rubykaigiB #rubykaigi

2015-12-13 16:27:32
よしこ @yoshiko_pg

型チェック(と型推論)はParseとEvalの間に挟む。 型推論を進めると、間違った型の値を与えられた箇所でBoolean == Numberみたいな矛盾が起きるので、エラーにする #rubykaigi #rubykaigiB

2015-12-13 16:27:40
やきとりい @yotii23

席の位置の関係で、同通の音声が漏れ聞こえてくるんだけど、a.ore ってファイルが「エィドットオゥレィ」みたいに本格的な発音になってるのがじわじわ面白い。もちろんセッション内容もすごい面白いです。 #rubykaigi #rubykaigiB

2015-12-13 16:27:53
あおの @aono_ex_parrot

型推論で矛盾が出たら型チェックを通っていないということ #rubykaigi #rubykaigiB

2015-12-13 16:28:12
よしこ @yoshiko_pg

自作言語内で使用している型に関するクラス Type::TyRaw(Bool, Numberなど) Type::TyFun(Function) Type::TyVar(not yet known) 不明なことを表す型も必要なんだね #rubykaigi #rubykaigiB

2015-12-13 16:29:42
Satoshi Kojima @skoji

#rubykaigi #rubykaigiB orescript実装の読み方ポイント説明。物はこれだな。 github.com/yhara/rk2015or…

2015-12-13 16:29:48
リンク GitHub yhara/rk2015orescript rk2015orescript - Tiny language with HM type inference
黒曜@Leaner Technologies @kokuyouwind

typingの実装にはTyRaw, TyFun, TyVarの3つのクラスを使っている。TypeCheck.unifyで単一化する。 #rubykaigi #rubykaigiB

2015-12-13 16:31:40
あおの @aono_ex_parrot

型推論には 「既知の型」のクラス 「関数の型」のクラス 「未知の型」のクラス の3つが必要になる #rubykaigi #rubykaigiB

2015-12-13 16:31:57
よしこ @yoshiko_pg

わあでもこれやることはわかるんだけどそれをコードで書くのむずそう・・・あとでコードよんでみよう github.com/yhara/rk2015or… #rubykaigi #rubykaigiB

2015-12-13 16:32:22
黒曜@Leaner Technologies @kokuyouwind

参考文献にさり気なく同人誌が混じってたぞw #rubykaigi #rubykaigiB

2015-12-13 16:32:26
あおの @aono_ex_parrot

型システムが貧弱な言語はプログラミングが大変 「自分自身を返す関数」の実装には何でも返していい型が必要になる #rubykaigi #rubykaigiB

2015-12-13 16:35:24