Search code examples
haskellfloating-pointliteralsrational-numbers

Why do Haskell numerical literals need to start and end with digits?


In The Haskell 98 Report it's said that

A floating literal must contain digits both before and after the decimal point; this ensures that a decimal point cannot be mistaken for another use of the dot character.

What other use might this be? I can't imagine any such legal expression.

(To clarify the motivation: I'm aware that many people write numbers like 9.0 or 0.7 all the time without needing to, but I can't quite befriend myself with this. I'm ok with 0.7 rather then the more compact but otherwise no better .7, but outwritten trailing zeroes feel just wrong to me unless they express some quantity is precise up to tenths, which is seldom the case in the occasions Haskell makes me write 9.0-numbers.)


I forgot it's legal to write function composition without surrounding whitespaces! That's of course a possibility, though one could avoid this problem by parsing floating literals greedily, such that replicate 3 . pred$8((replicate 3) . pred) 8 but replicate 3.pred$8(replicate 3.0 pred)8.


There is no expression where an integer literal is required to stand directly next to a ., without whitespace?


Solution

  • One example of other uses is a dot operator (or any other operator starting or ending with a dot): replicate 3.pred$8.

    Another possible use is in range expressions: [1..10].

    Also, you can (almost) always write 9 instead of 9.0, thus avoiding the need for . altogether.