# 088: Binding Groups について調べる [↑up](bunny_notes) - issued: 2020-05-22 - 分類: 分類:D 要調査 - status: Open ## 概要 Binding Groups について調べる。 現状の toBg 実装は、Thih の仕様をみたしていないように見える。 [11.6.3 結合されたバインディング・グループ](https://uhideyuki.sakura.ne.jp/studs/index.cgi/ja/thihnote#p26) より: 「es 内の束縛は、グループ内のどの束縛に依存してもよいが、少なくとも isn に含まれるものには依存する はずである。そうでないなら、グループはおそらく最小になっていない。また、es が空なら n=1 になる」 [073](bissue073) の問題は、これにかかわっているようにも思えるが、まだわからない。 以下の記事なども参照すべきか: - [16.1.1.5. Typechecking of recursive binding groups](https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/bugs.html#typechecking-of-recursive-binding-groups) - [Haskell 2010 4.5.1 Dependency Analysis](https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-890004.5.1) ## 2020-05-22 [073](bissue073) の対策のなかで、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](bissue068) でいれていた仮対処、つまり、AsPat の処理で、
以下のように case の検査項に直接右辺値を書いていた回避策を解除できた。

$$
{
  x = (1, 2)
  a = case (1, 2) of
   (x, y) -> x
$$}