# 2015 年 6 月 ## 2015-06-30 ねむい。 $$
{ 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))]) $$} ちょっと時間かけてみないとな。 ## 2015-06-29 おお、ねむ。 $${ 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 $$} となる。もう少し、型推論通すまでかかりそう。 ## 2015-06-22 ### [Bunny] 型推論エラー おっと、これは少し根深そう。 アルファ変換して、すべて top level binding みたいにしちゃっているのがまずかったみたい。 ちょっとよく考えなくちゃ。 ということで、今日はねる。 追記:上に書いた通り、アルファ変換して名前は衝突しなくなったから、といって、 すべての binding をトップレベルにしてしまったのが間違い。let 式の binding は let 式の中に含めないと、レキシカルスコープがうまく実現されない。 具体的には、関数定義中のパターンによって束縛される変数スコープの外に、let binding が置かれることになって、型推論器がまっとうな文句を言っている状況。直す。 ## 2015-06-17 ### [Bunny] toBg2 とりあえず書いて、型推論 いきなりうまくいくとは思ってなかったけど、やっぱりいろいろエラー。調べつつ直していこう。 すごーく単純なものでもエラーするんだけど、これはうまくいった。 $${ $ 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))] $$} ## 2015-06-14 記録として。 長男に平手の将棋で負けた。ま、わたしは全然強くないので、わたしに勝ってもどうということはないのだが、そうか、もう負けちゃうか。 彼はクラスに将棋の強い子がいて、しょっちゅうコマ落ちでささせてもらっているらしい(どうにか五枚落ちで勝てるようになったとか)ので、あっというまに強くなってしまうんだろうな。 ## 2015-06-11 そうか、TempBind の真ん中の要素は Maybe Scheme じゃなくて、Maybe (Qual Type) でよかったと気づいたので、それだけ直して、もう寝よう。 明日から日曜までは夜更かししない予定なので、また、しばらく空いちゃうな。 ## 2015-06-10 ### [Bunny] toBg1 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 から名前で検索して、 - 同じ名前がみつからないなら、([], tbs) に分解、 - 同じ名前が、ちゃんと(同じレベルでは隣接して)見つかったら、(tb, tbs') に分解、 - 重複定義なら、Multiple Declarations 報告 という、抽出関数をつくるのがよさそう。 ## 2015-06-01 ### [Bunny] Rename おわりかけなんだけど… ノートに書いてあったメモにしたがって、少し進めたい - ${(TCon (Tycon "(->)" (Kfun Star (Kfun Star Star))))} とかの $ {"(->)"} がおかしいかなと思ったんだが、これは Typing.hs に書いてあるもので Thih 由来なので、とりあえず保留。型推論器の動作をみながら修正