guibou / PyF

Haskell QuasiQuoter for String Formatting

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Pattern matches are non-exhaustive

erikd opened this issue · comments

Compiling git HEAD I get:

src/PyF/Formatters.hs:177:9: warning: [-Wincomplete-uni-patterns]
    Pattern match(es) are non-exhaustive
    In a pattern binding:
        Patterns not matched:
            FractionalRepr Negative [] [] []
            FractionalRepr Negative [] [] (_:_)
            FractionalRepr Negative [] (_:_) []
            FractionalRepr Negative [] (_:_) (_:_)
            ...
    |
177 |     let (FractionalRepr Positive aa bb cc) = reprFractional fmt precision (abs f)
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

src/PyF/Formatters.hs:191:22: warning: [-Wincomplete-uni-patterns]
    Pattern match(es) are non-exhaustive
    In a pattern binding:
        Patterns not matched:
            ([], [], (_:_))
            ([], (_:_), (_:_))
            ((_:_), [], (_:_))
            ((_:_), (_:_), (_:_))
    |
191 |       Percent -> let (a, b, "") = splitFractional (Numeric.showFFloatAlt precision (iAbs * 100) "") in (a, b, "%")

Even if these extra options are basically impossible, the compiler can't prove that so the dev has to satisfy the compiler.

Thank you for opening this issue.

Yes, this part of the code is old and I never really took the time to design a solution.

As you said, in theory, that's basically impossible, but software engineering is full of realized impossible stories.

I'm open to suggestion, otherwise I'll try to fix that.

Even just a wild card pattern match like:

  | isNegativeZero f =
      case reprFractional fmt precision (abs f) of
        FractionalRepr _ aa bb cc -> FractionalRepr Negative aa bb cc
        other -> error $ "reprFractional (isNegativeZero f): The impossible happened : " ++ show other

would be preferable as it satisfies the compiler and if the impossible does actually happen gives a better error message than the normal incomplete pattern match exception.