# 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
$$}