Thanks for the encouragement Rodrigo!  I'll follow the process and
hope to open a ticket soon.


Viktor Dukhovni (2025-Jul-21, excerpt):
> It is also fair to point out that once an Int or other bounded integral
> type is read, arithmetic with that type (addition, subtraction and
> multiplication) silently overflows.  And so silent overflow in `read`
> is not inconsistent with the type's semantics.

I see parsing as a boundary between an outside world (throwing text at
me) and an inside world, where I have programmed some algorithm.  As
programmer, it is my responsibility to ensure that the types are
chosen so that the algorithm works correctly, ideally on any accepted
input, i.e., I have to guarantee that no inadvertent overflow happens
in this inside world.  However, calculating away based on
misinterpreted input, will lead to invalid results.


Viktor Dukhovni (2025-Jul-21, excerpt):
> That said, if various middleware libraries hide overflows, because under
> the covers thay're using `read`, that could be a problem, so we do want
> the ecosystem at large to make sensible choices about when silent
> overflow may or may not be appropriate.  Perhaps that means having
> both wrapping and overflow-checked implementations available, and
> clear docs with each about its behaviour and the corresponding
> alternative.

I did not realise this clearly enough before, but have elaborated a
bit on Haskell-cafe [1].  We do have unbounded `read :: String ->
Integer` and silently overflowing `fromInteger :: Integer -> Word8`,
which can be combined if overflow is desired.  This follows the idea
to be explicit about dangerous things.  In addition, we have `read ::
String -> Word8` and company, which I'd like to fix.


> A few of quick observations about [2]:

Thank you =)

>     - It disallows expliccit leading "+" (just like "read", but perhaps
>       that should be tolerated).

Yes, it probably should not be that strict.  For my own projects I
assumed it easier to make it more forgiving later, than the other way
round.  There really should be consensus on whether or not leading `+`
or `0` should be allowed.  But these are fixes to make towards the
end, I guess.

>     - It disallows multiple leading zeros, perhaps these should be
>       tolerated.
>
>     - It disallows "-0", perhaps these should be tolerated, as well
>       as "-0000", "-000001", ...  (With lazy ByteStrings, which might
>       never terminate, there is a generous, but sensible limit on
>       the number of leading zeros allowed).

I ruled this out because I wanted a simple guarantee for termination.
Your idea of “generous, but sensible” sounds compelling, the leading
`0`s can be cosumed in constant space, we need not keep them.

>     - One way to avoid difficulties with handling negative minBound is
>       to parse signed values via the corresponding unsigned type, which
>       can accommodate `-minBound` as a positive value, and then negate
>       the final result.  This makse possible sharing the low-level
>       digit-by-digit code between the positive and negative cases.

How do you mean?  I did not get this “accommodate `-minBound` as a
positive value” right, my initial approach to use

    char '-' >> negate <$> parseUnsigned (negate minBound)

fails, exactly because the negation of the lower bound may not be
(read: is usually not) within the upper bound, and thus wraps around,
e.g., incorrectly `negate (minBound :: Int8)` → `-128` due to the
upper bound of `127`.

Viktor Dukhovni (2025-Jul-21, excerpt):
> If parsing of Integer and Natual is also in scope […]

No, not at all.  I have no reservations against `read` for the
unbounded types.  That should be left alone.

Cheers
Stefan


[1]: https://mail.haskell.org/pipermail/haskell-cafe/2025-July/137162.html
[2]: https://github.com/s5k6/robust-int


--
Stefan Klinger, Ph.D. -- computer scientist              o/X
http://stefan-klinger.de                                 /\/
https://github.com/s5k6                                    \
I prefer receiving plain text messages, not exceeding 32kB.
_______________________________________________
ghc-devs mailing list
ghc-devs@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs

Reply via email to