Binding Groups について調べる。
現状の toBg 実装は、Thih の仕様をみたしていないように見える。
「es 内の束縛は、グループ内のどの束縛に依存してもよいが、少なくとも isn に含まれるものには依存する はずである。そうでないなら、グループはおそらく最小になっていない。また、es が空なら n=1 になる」
073 の問題は、これにかかわっているようにも思えるが、まだわからない。
以下の記事なども参照すべきか:
073 の対策のなかで、tcBind の Type-check の結果 subst を 引き継ぐように修正:
if null qs then ((v, e'), st{tcNum=num, tcSubst=s}) else ((v, Lam (mkVs n qs) e'), st{tcNum=num, tcSubst=s})
さらに、概要で引用した BindGroup の要件を鑑み、 Expl が null のときには、[[Impl]] のサイズが1になるように、let binding をばらす 仮対処をいれた(Rename):
@@ -703,7 +705,12 @@ renExp (A.LetExp ds e) = do e' <- renExp e exitLevel let bgs = toBg tbs - assert (length bgs == 1) $ return (Let (head bgs) e') -- TODO: (head bgs) is temporary + (es, iss) = head bgs + f [] bdy = bdy + f (is:iss') bdy = Let ([],[is]) (f iss' bdy) + if null es + then return $ f iss e' + else return (Let (head bgs) e')
これによって、068 でいれていた仮対処、つまり、AsPat の処理で、 以下のように case の検査項に直接右辺値を書いていた回避策を解除できた。
x = (1, 2) a = case (1, 2) of (x, y) -> x