# 035: myeq3.hs がランタイムで Error: Non-exhaustive patterns. [↑up](bunny_notes) - issued: 2020-04-16 - 分類: A サンプルコードが fail - status: Closed (2020-05-15) ## 調査ログ ### 2020-05-14 もうすこし簡単な例 (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" が入っているあたりが怪しいな。 パタンマッチコンパイル周辺で、変数一つの場合を、なんか、特別扱いしてなかったかな。 (遠い記憶) ## 2020-05-15 ### TrCore における扱い どこかで 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 を変換をただしくなおす、という感じかな。 ### 逆転していた個所: BindGrouping.bindMap $${ --- 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 に来ることがなかった。このあたり、要復習。