関数型言語を作ろう!あるいはRubyistのための型推論入門 #rubykaigi 2015 #rubykaigiB
UnificationでのTypingの話。型システム入門読んでるとこの辺はわかりやすい感じ。 amazon.co.jp/gp/product/427… #rubykaigi #rubykaigiB
2015-12-13 16:19:01twitter.com/yoshiko_pg/sta… #rubykaigi #rubykaigiB
2015-12-13 16:20:27f = 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実装の話。Parse, Type check, Executeの3ステップで実行する。説明の都合上1,3,2の順で説明する。 #rubykaigi #rubykaigiB
2015-12-13 16:22:01型推論の処理は、まずParse。コードを構文木に変換する Rubyではracc gemとかでできる #rubykaigi #rubykaigiB
2015-12-13 16:23:02RubyだとParserに何使うんだろうと思ったら、gemがいろいろあるのね。今回はracc gemを使ってるとのこと。lexとparseは分かれずに、charをそのままトークンとして文法を定義するのか。 #rubykaigi #rubykaigiB
2015-12-13 16:23:43Rubyで木構造を扱うときはネストした配列として扱うのが楽 Parseできたら、木構造の上から順に実行(Eval)する #rubykaigi #rubykaigiB
2015-12-13 16:24:39パース後はシンボルのリストになる。実行のところを聞き逃したけど、まぁリストだしよしなに実装するんだろう。規模が大きくなったら構文要素ごとにクラスに分けて、クラスごとにeval持つ感じになるのかな。 #rubykaigi #rubykaigiB
2015-12-13 16:26:13identity = fn(x) { x } みたいな奴はどう推論するのだろう。 #rubykaigiB #rubykaigi
2015-12-13 16:27:32型チェック(と型推論)はParseとEvalの間に挟む。 型推論を進めると、間違った型の値を与えられた箇所でBoolean == Numberみたいな矛盾が起きるので、エラーにする #rubykaigi #rubykaigiB
2015-12-13 16:27:40席の位置の関係で、同通の音声が漏れ聞こえてくるんだけど、a.ore ってファイルが「エィドットオゥレィ」みたいに本格的な発音になってるのがじわじわ面白い。もちろんセッション内容もすごい面白いです。 #rubykaigi #rubykaigiB
2015-12-13 16:27:53自作言語内で使用している型に関するクラス Type::TyRaw(Bool, Numberなど) Type::TyFun(Function) Type::TyVar(not yet known) 不明なことを表す型も必要なんだね #rubykaigi #rubykaigiB
2015-12-13 16:29:42#rubykaigi #rubykaigiB orescript実装の読み方ポイント説明。物はこれだな。 github.com/yhara/rk2015or…
2015-12-13 16:29:48typingの実装にはTyRaw, TyFun, TyVarの3つのクラスを使っている。TypeCheck.unifyで単一化する。 #rubykaigi #rubykaigiB
2015-12-13 16:31:40型推論には 「既知の型」のクラス 「関数の型」のクラス 「未知の型」のクラス の3つが必要になる #rubykaigi #rubykaigiB
2015-12-13 16:31:57わあでもこれやることはわかるんだけどそれをコードで書くのむずそう・・・あとでコードよんでみよう github.com/yhara/rk2015or… #rubykaigi #rubykaigiB
2015-12-13 16:32:22参考文献にさり気なく同人誌が混じってたぞw #rubykaigi #rubykaigiB
2015-12-13 16:32:26型システムが貧弱な言語はプログラミングが大変 「自分自身を返す関数」の実装には何でも返していい型が必要になる #rubykaigi #rubykaigiB
2015-12-13 16:35:24Make a functional language (with type inference) in Ruby twitter.com/yoshiko_pg/sta…
2015-12-13 16:35:36