ねむい。
drive_semant: insts: Prim.Show
となるので、show 呼んでいるところをコメントアウトしたら、こうなった↓
drive_semant: cannot resolve ambiguity: (ClassEnv {ce_map = fromList [("Main.Eq",([],[])),("Main.Monad",([],[[] :=> IsIn "Main.Monad" (TCon (Tycon "Main.IO" (Kfun Star Star)))])),("Main.Ord",([],[[] :=> IsIn "Main.Ord" (TCon (Tycon "Main.Integer" Star))]))], defaults = [TCon (Tycon "Integer" Star),TCon (Tycon "Double" Star)]},[],[IsIn "Main.Ord" (TVar (Tyvar ".v6" Star))])
ちょっと時間かけてみないとな。
おお、ねむ。
drive_semant: types do not unify: TCon (Tycon "IO" (Kfun Star Star)), TCon (Tycon "Main.IO" (Kfun Star Star))
そこで、tqd_t.hs 中にて Main の型宣言をとりあえずコメントアウトすると、
drive_semant: insts: Prim.Show
となる。もう少し、型推論通すまでかかりそう。
おっと、これは少し根深そう。
アルファ変換して、すべて top level binding みたいにしちゃっているのがまずかったみたい。
ちょっとよく考えなくちゃ。
ということで、今日はねる。
追記:上に書いた通り、アルファ変換して名前は衝突しなくなったから、といって、 すべての binding をトップレベルにしてしまったのが間違い。let 式の binding は let 式の中に含めないと、レキシカルスコープがうまく実現されない。 具体的には、関数定義中のパターンによって束縛される変数スコープの外に、let binding が置かれることになって、型推論器がまっとうな文句を言っている状況。直す。
いきなりうまくいくとは思ってなかったけど、やっぱりいろいろエラー。調べつつ直していこう。
すごーく単純なものでもエラーするんだけど、これはうまくいった。
$ echo 'x = "hoge"' | sample/drive_semant ... ["Main.x" :>: Forall [] ([] :=> TAp (TCon (Tycon "[]" (Kfun Star Star))) (TCon (Tycon "Char" Star)))]
これは、型推論というほどのものではないからね。
これもいけてるか:
$ echo 'id x = x' | sample/drive_semant ... ["Main.id" :>: Forall [Star] ([] :=> TAp (TAp (TCon (Tycon "(->)" (Kfun Star (Kfun Star Star)))) (TGen 0)) (TGen 0))]
記録として。
長男に平手の将棋で負けた。ま、わたしは全然強くないので、わたしに勝ってもどうということはないのだが、そうか、もう負けちゃうか。
彼はクラスに将棋の強い子がいて、しょっちゅうコマ落ちでささせてもらっているらしい(どうにか五枚落ちで勝てるようになったとか)ので、あっというまに強くなってしまうんだろうな。
そうか、TempBind の真ん中の要素は Maybe Scheme じゃなくて、Maybe (Qual Type) でよかったと気づいたので、それだけ直して、もう寝よう。
明日から日曜までは夜更かししない予定なので、また、しばらく空いちゃうな。
toBg1 で quantify を済ませるというのは思ったとおりにできた。
んで、toBg2 に移る前に、同じ名前の Alts を束ねるのがうまくいっているかみてみたら、 ぜんぜんうまくいってなかった。
(92,"Main.%IO.fail","Main.qsort") (92,"Main.qsort","Main.l3.l0.l0.l0.l0.l0.F") (91,"Main.l3.l0.l0.l0.l0.l0.F","Main.l3.l0.l0.l0.l0.l0.F") (92,"Main.l3.l0.l0.l0.l0.l0.F","Main.l3.l0.l0.l0.OK") (92,"Main.l3.l0.l0.l0.OK","Main.l3.l0.smaller") (92,"Main.l3.l0.smaller","Main.l3.l0.l1.l0.l0.l0.F") (91,"Main.l3.l0.l1.l0.l0.l0.F","Main.l3.l0.l1.l0.l0.l0.F") (92,"Main.l3.l0.l1.l0.l0.l0.F","Main.l3.l0.l1.l0.OK") (92,"Main.l3.l0.l1.l0.OK","Main.l3.l0.larger") (92,"Main.l3.l0.larger","Main.qsort") (92,"Main.qsort","Main.main")
ああ、そうか。いっこめの Main.qsort とにこめの Main.qsort の間に、 ローカルな binding がいっぱい挟まるのか。
同じレベルの他の名前にぶつかるまで遡るなどが必要。実際は、tbs から名前で検索して、
という、抽出関数をつくるのがよさそう。
ノートに書いてあったメモにしたがって、少し進めたい