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