定期ミートアップ 第33回
bidi
bidi
bidirectional typechecking
check (eがAという型で問題ないか) e ← A
synth (eの型として考えられるものは何か) e → A
complete and easy〜
↑を拡張したもの
未知の型をExistential(存在型)とおく
HM型推論は、型に関する等式をたくさん作ってunifyする パターン1。ブロックパラメータの型
実装中
code:sk
nums.each{|i: ???| p i}
ヒント: Array<Int>#each(f: Fn1<Int, Void>) -> Void
パターン2。メソッド単位の型引数の推論
code:sk
nums.map<???>{|i: Int| i.to_s}
ヒント: Array<Int>#map<U>(f: Fn1<Int, U>) -> Array<U>
パターン2'。newの型
code:sk
a = Pair.new(1, true)
a = Pair.new<??, ??>(1, true)
ヒント: Pair.new<A, B>(a: A, b: B) -> Pair<A, B>
パターン3。型無しの引数宣言
複雑そうなので後回し
a = []
letを入れる予定
if letを入れたい
スコープ
let a;
議論
Array<Int>とmap<Int>で<>の意味が違うが、統一できないか
たしかに〜〜
前者に統一するとしたら
obj.method で関数が取れるような?
Lisp-1でないときれいにならなそう
後者に統一するとしたら
後者ってこれ…何なんだろう
そういえばちゃんと考えたことがなかった
型注釈の一種?