もうすこし簡単な例 (casewithwild.hs) でも再現する:
myshow (True, True) = "true" myshow _ = "false" main = putStrLn $ myshow (False, True)
これの変換結果(core0) が、mixture rule によるものになっていない気がする。
(Main.myshow :: (((Prelude.(,) Prelude.Bool) Prelude.Bool) -> [Prelude.Char])) =
\(_Main.myshow.U1 :: ((Prelude.(,) Prelude.Bool) Prelude.Bool)) ->
case (_Main.myshow.U1 :: ((Prelude.(,) Prelude.Bool) Prelude.Bool)) (_Main.myshow.U1b :: ((Prelude.(,) Prelude.Bool) Prelude.Bool)) of
DEFAULT (_Main.myshow.U1 :: t12)->
"false"
Prelude.(,) (_Main.myshow.U2 :: t4) (_Main.myshow.U3 :: t5) :: (t4 -> (t5 -> ((Prelude.(,) t4) t5))) ->
case (_Main.myshow.U2 :: t4) (_Main.myshow.U2b :: t4) of
Prelude.False :: Prelude.Bool ->
(Prim.neErr :: t11)
Prelude.True :: Prelude.Bool ->
case (_Main.myshow.U3 :: t5) (_Main.myshow.U3b :: t5) of
Prelude.False :: Prelude.Bool ->
(Prim.neErr :: t10)
Prelude.True :: Prelude.Bool ->
"true"
DEFALUT に "false" が入っているあたりが怪しいな。 パタンマッチコンパイル周辺で、変数一つの場合を、なんか、特別扱いしてなかったかな。 (遠い記憶)
どこかで Alts をひっくり返している奴がいるなと思ったら…、TrCore.dsgAlts 内で、rmWild しているところかな…と思ったが、最後に reverse している。どこだろう?
Semant.renProg で逆転していたので、以下のように trace を仕掛けたところ、 toBg で逆転していた(tbs は ok, bgs で逆転)
let bgs = toBg $ tbs ++ itbs
bgs'' = toBg $ ctbs ++ tbs ++ itbs
trace ("tbs:" ++ show tbs) $ return ()
trace ("bgs:" ++ show bgs) $ return ()
toBg で逆転しているのを直すと、それにともなって TrCore.renExpr もなおさないと、 一次的に動かなくなると思われる。ブランチ切ろう。
手順としては、toBg での逆転をなおす、rmWild でわざと逆転させる、で、 ひとまずいままで通り動く。そのご、Fatbar を変換をただしくなおす、という感じかな。
--- a/compiler/src/BindGrouping.hs
+++ b/compiler/src/BindGrouping.hs
@@ -127,7 +127,7 @@ bindMap tbs' rh = bmap tbs' rh Map.empty
i = fromMaybe (error $ "Must not happen. Vertex Id not found: " ++ name)
(Map.lookup name h)
tb' = case Map.lookup i d of
- Just (_, _, alts') -> (name, Nothing, alts++alts')
+ Just (_, _, alts') -> (name, Nothing, alts'++alts)
Nothing -> tb
d' = Map.insert i tb' d
自分を前に足していた。
TrCore.transExpr も修正して、ただしく case 式が生成されるようになった。
ただし、すでに通っていた sample194 (showlist2.hs)が通らなくなってしまったので、 これは再び testases に降格する。 また、この showlist2.hs にあるのと同様の定義が、instance Show [Double|Float] に残っていたのが同じくエラーしていたが、これらは不要だったので lib/Prelude.hs から削除。
なお、本件の修正においては、transExpr に Fatbar e1@(case ..) e2 というのが来たら、 e1 の DEFALUT に e2 を設定するのかなと思っていたのだが、 そもそもこの形で transExpr に来ることがなかった。このあたり、要復習。