# 087: litpattern2.hs で Non-exhaustive patterns in renExp: LitExp (LitFloat 0.0 (1,3)) [↑up](bunny_notes) - issued: 2020-05-20 - 分類: A サンプルコードが fail - status: Open ## 概要 [083](bissue083) で、左辺のパターンにリテラルがあるケースには対処したのだが、 そもそも、浮動小数点数リテラルに未対応だった。 litpatterns2b.hs も同様 ## 調査ログ ## 2020-10-08 浮動小数点数リテラル対応にむけ、もっと単純化したテストケースを用意 (floatliteral.hs): $$
{ main = print (3.14 :: Double) $$} これをコンパイルすると、以下のようなエラーになる。 $${ doCompile ... bunnyc: Non-exhaustive patterns in renExp: LitExp (LitFloat 3.14 (1,15)) $$} 浮動小数点リテラルを、Rational 値に fromRational を適用した形として扱うように修正。 lexer で Float 型として扱ってしまっていたのを Double に直すなど、 意外と多くの修正が必要だった([変更箇所](https://github.com/unnohideyuki/bunny/commit/67f29ee14dccc7bae9d66320f48e840ab0f08434))。 floatliteral.hs はこれで通るように。 litpattern2.hs はエラーになる。f に型注釈とつけると通った (litpattern2c.hs): $${ f :: Double -> String f 0.0 = "0.0" f _ = "non-zero" main = do putStrLn $ f 1.0 putStrLn $ f 0.0 $$} また、呼び出し側の値に型注釈をつけても通る (litpattern2d.hs): $${ f 0.0 = "0.0" f _ = "non-zero" main = do putStrLn $ f (1::Double) putStrLn $ f (0::Double) $$} これは、Fraction に関する defaulting に未対応であるせいだと思われる。 この件のテストとして、litpattern2.hs を少し改変して以下のようにしておく: $${ f 0.0 = "0.0" f _ = "non-zero" main = do putStrLn $ f 1 putStrLn $ f 0.0 $$} この件は、継続(defaulting 対応まで保留)。 以下を test に追加: - litpattern2c.hs: sample286.hs - litpattern2d.hs: sample287.hs ## 2021-10-27 全件確認中。 $${ unno@unno-FMVD70GN7G ~/work/bissues/087 $ cat litpattern2.hs f 0.0 = "0.0" f _ = "non-zero" main = do putStrLn $ f 1 putStrLn $ f 0.0 unno@unno-FMVD70GN7G ~/work/bissues/087 $ runhaskell litpattern2.hs non-zero 0.0 unno@unno-FMVD70GN7G ~/work/bissues/087 $ ~/prj/bunny/compiler/bin/bunny testrun litpattern2.hs /home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/litpattern2 --xno-implicit-prelude /home/unno/prj/bunny/compiler/bin/../lib/Prelude.hs /home/unno/prj/bunny/compiler/bin/bunnyc -d ./jout/litpattern2 --xlibrary-path /home/unno/prj/bunny/compiler/bin/../lib litpattern2.hs bunnyc: cannot resolve ambiguity: [(Tyvar "v8806" Star,[IsIn "Prelude.Fractional" (TVar (Tyvar "v8806" Star))]),(Tyvar "v8798" Star,[IsIn "Prelude.Fractional" (TVar (Tyvar "v8798" Star))])] testrun: failed to compile litpattern2.hs $$}