# 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 由来なので、とりあえず保留。型推論器の動作をみながら修正