087: litpattern2.hs で Non-exhaustive patterns in renExp: LitExp (LitFloat 0.0 (1,3))

↑up

概要

083 で、左辺のパターンにリテラルがあるケースには対処したのだが、 そもそも、浮動小数点数リテラルに未対応だった。

litpatterns2b.hs も同様

調査ログ

2020-10-08 (Thu)

浮動小数点数リテラル対応にむけ、もっと単純化したテストケースを用意 (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 に直すなど、 意外と多くの修正が必要だった(変更箇所)。

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 に追加:

2021-10-27 (Wed)

全件確認中。

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