昨日、tcExpr をいちおう Case 式に対応させた*1ら、 illegal type for dictionary: TVar (Tyvar ".v129" Star) といってエラーするようになってた件。
なんか、Core 言語の時点で、あちこちに Tyvar が残っているのはおかしいはずで、 型推論が終わった時点で残っている型変数は、TGen になってるべき(つまり、型は quantifyされているべき)なんじゃないか。
というわけで、あちこちに、えい、えいっと quantify をいれてみた。 いかにも対症療法的でアレなんだけど、まずは動かすぞーという。あとできれいにしたい。
んで、そうこうしていたら、「次の」問題に出くわした。
$ ./test-compile.sh testcases/tqd.hs (中略) ("Main.l1.l0.l0.l0.OK",[],Var (TermVar "Prelude.<=" ([IsIn "Prelude.Ord" (TGen 0)] :=> TAp (TAp (TCon (Tycon "(->)" (Kfun Star ( Kfun Star Star)))) (TGen 0)) (TAp (TAp (TCon (Tycon "(->)" (Kfun Star (Kfun Star Star)))) (TGen 0)) (TCon (Tycon "Bool" Star)))) ),[IsIn "Prelude.Ord" (TGen 0)],TAp (TAp (TCon (Tycon "(->)" (Kfun Star (Kfun Star Star)))) (TGen 0)) (TAp (TAp (TCon (Tycon "(- >)" (Kfun Star (Kfun Star Star)))) (TGen 0)) (TCon (Tycon "Bool" Star))),TAp (TAp (TCon (Tycon "(->)" (Kfun Star (Kfun Star Star )))) (TGen 0)) (TAp (TAp (TCon (Tycon "(->)" (Kfun Star (Kfun Star Star)))) (TGen 0)) (TCon (Tycon "Bool" Star))),0,[],Nothing,F alse) bunnyc.exe: dictionary not found: 0
これ、OK というのは、リスト内包式を Let 式に変換したときに生じる変数なんですが、 そいつの型に qualifier がついていないので単相にみえるんだけど、その中で (<=) :: Ord t0 => t0 -> t0 -> Bool が呼ばれているのであかんやろ、といってる。
その苦情はごもっともで、OK の型がおかしい。そういや、その辺さぼったような…。
今日は、ここまで。
(++) (x:xs) ys = x : (xs ++ ys) の最後の括弧をとると期待通り動かない(無限ループする)問題があって、 Fixity Resolution 動いてないのか? まったくテストしてなかったんだっけ?と思っていたのですが。
で、考えてみると、: の fixity 宣言しわすれていたし、そういえば、 : の qualified name は Prim.: だったねということで対処し、解決。
test9a は pass したので、check 用テストに加えました。(sample104) いやぁ、make check できるようにしてから、だいぶ効率があがった気がする。
今日のは、お昼休みにパッと直してコミット。 つぎあたり、tcExpr を Case 式に対応させたいね。