Re: Correct parsers for bounded integral values

Pierre Thierry <[email protected]> Mon, 21 Jul 2025 18:33:22 +0200
Newsgroups gmane.comp.lang.haskell.cafe
Message-ID <[email protected]>
Le 21/07/2025 à 17:42, Stefan Klinger a écrit :
>      x = 123456
> is equivalent to
>      x = fromInteger (read "123456" :: Integer)

It's basically what happens internally. You can see the convertInt 
<https://hackage.haskell.org/package/ghc-internal-9.1201.0/docs/src/GHC.Internal.Read.html#convertInt> 
function and it's used a few lines beneath in the Read Int instance.

convertInt :: Num a => L.Lexeme -> ReadPrec a
convertInt (L.Number n)
  | Just i <- L.numberToInteger n = return (fromInteger i)

> But there is a *different* read function
>
>      read :: String -> Word8
>
> which is not used in the scenario above, and this is the buggy one
> (and all its bounded cousins).
Well, IIUC, it conforms to the Haskell 98 specification. In that sense, 
it's not buggy. But the specification may be sound and counter-intuitive 
(which is not an uncommon combination…).

Curiously,
Pierre Thierry
-- 

[email protected]
0xD9D50D8A

_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
OpenPGP_0xC5ED7720D9D50D8A.asc (application/pgp-keys, 10.3 KB)
-----BEGIN PGP PUBLIC KEY BLOCK-----

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
QtUKAJ9kZsjY7DiDNlxCrEkDYjVpYvRvQcJTBBARAgALBQI6gImGBAsDAgEAEgkQ
xe13INnVDYoHZUdQRwABAcmpAJ9fTwFzRn1KHcGVEZeu869gGkLVCgCfZGbI2Ow4
gzZcQqxJA2I1aWL0b0HNJFBpZXJyZSBUaGllcnJ5IDxwdGhpZXJyeUBza3JlZWwu
b3JnPsJGBDARAgAGBQI8bI07AAoJEMXtdyDZ1Q2KixEAoPvp7aLc1njkN2ZBh5Va
weCFS7tYAKCQSk8RWEz0IIDRw0qQu7l0BuKG5cJTBBARAgALBQI6gIloBAsDAgEA
EgkQxe13INnVDYoHZUdQRwABAWLLAJ9iw9yOnB39zDjEgF1aEowUO8xkTACfQ8oJ
WFYWX45twH8fDKwm7gr0E4rCUwQQEQIACwUCOoCJaAQLAwIBABIJEMXtdyDZ1Q2K
B2VHUEcAAQFiywCfYsPcjpwd/cw4xIBdWhKMFDvMZEwAn0PKCVhWFl+ObcB/Hwys
Ju4K9BOKzSZsZSBNb2luZSBGb3UgPHB0aGllcnJ5QG11bHRpbWFuaWEuY29tPsJG
BDARAgAGBQI8bI0bAAoJEMXtdyDZ1Q2Kt80AnRUi4Rg7Yt9saKMk80O6Of9jgD62
AKCsS5xvV6JV0U4XQhBfhxy6RHRMM8JTBBARAgALBQI6XxtyBAsDAgEAEgkQxe13
INnVDYoHZUdQRwABAdJvAJ0fLvR+NxBRpduFPvUvtpYYEsiBiwCgjOJ9cxi4wBqJ
E2bF1Kaz+43v4lvCUwQQEQIACwUCOl8bcgQLAwIBABIJEMXtdyDZ1Q2KB2VHUEcA
AQHSbwCdHy70fjcQUaXbhT71L7aWGBLIgYsAoIzifXMYuMAaiRNmxdSms/uN7+Jb
zSdQaWVycmUgVGhpZXJyeSA8cGllcnJlLnRoaWVycnlAbm9vcy5mcj7CRgQwEQIA
BgUCPGyNCgAKCRDF7Xcg2dUNignXAKD9E/OEbIimpD0c7O7i/yimDkXfcwCfW67E
fXvGz3N2MbqCR6jcIahGHx/CUwQQEQIACwUCOl2w2AQLAwIBABIJEMXtdyDZ1Q2K
B2VHUEcAAQFTVQCgp/iOxS5M8E3Jb0heDNm4JFdvRQQAoPzUn9u/I0M3lVzz20o2
bwc27KINwlMEEBECAAsFAjpdsNgECwMCAQASCRDF7Xcg2dUNigdlR1BHAAEBU1UA
oKf4jsUuTPBNyW9IXgzZuCRXb0UEAKD81J/bvyNDN5Vc89tKNm8HNuyiDc0oUGll
cnJlIFRoaWVycnkgPHBpZXJyZS50aGllcnJ5QGFmdWwub3JnPsJJBDARAgAJBQJP
1RKVAh0gAAoJEMXtdyDZ1Q2KdXcAn1jo2NHfSPudROCkm2tiMfxukqL3AKC915Gy
KFoC7/WVVvyOOCWO4akVqcJcBBMRAgAcBQI+3kY/AhsDBAsHAwIDFQIDAxYCAQIe
AQIXgAAKCRDF7Xcg2dUNiiaiAJ9vhHaj7qfnH0UXaMxRDG2sDHm8twCfZBnRhnbb
m1qwx1T9IOJFSrozKlTCYAQTEQIAIAIbAwIeAQIXgAUCRJkgSQYLCQgHAwIEFQII
AwQWAgMBAAoJEMXtdyDZ1Q2KM+8AniWO2y9+6uVa2MNItga93pHsd6wTAJ9h34sC
Gh1HP4zm7i8kYHyUGPN1p8JgBBMRAgAgAhsDAh4BAheABQJI5VhhBgsJCAcDAgQV
AggDBBYCAwEACgkQxe13INnVDYo3cQCgweIv67JyMmMb3j3xOA+FuoxwEb4AnAre
8FUh5dQxsOFe2xe+kathwCe1zSlQaWVycmUgVGhpZXJyeSA8cGllcnJlLnRoaWVy
cnlAZmZqZHIub3JnPsJJBDARAgAJBQJP1RKYAh0gAAoJEMXtdyDZ1Q2KgXQAoPTB
SuPadV5ZRiL9WUZBF5jQ2KjKAKCZq5kzSHVqfV9Fcmo13L8O4Tmi1cJcBBMRAgAc
BQI+3kYlAhsDBAsHAwIDFQIDAxYCAQIeAQIXgAAKCRDF7Xcg2dUNitDSAJ0YB0kP
Vu6SsmUR7cjKxgx4unYxSwCg/riJN7j8kELrlnxS9UNoO7aminrCYAQTEQIAIAIb
AwIeAQIXgAUCRJkgSQYLCQgHAwIEFQIIAwQWAgMBAAoJEMXtdyDZ1Q2KHyUAoPnT
OGw1nB7JKFIg1tpspnH6MyOyAJ40NpyJrFZj1N91Ksw16erye3ftHsJgBBMRAgAg
AhsDAh4BAheABQJI5VhhBgsJCAcDAgQVAggDBBYCAwEACgkQxe13INnVDYo9TgCg
80mUL7C0zbaORzRxEBRn9r9IBvAAmwZCUNlwzZgyaz/wpxDFB6NypD5RzSpQaWVy
cmUgVGhpZXJyeSA8cGllcnJlLnRoaWVycnlAd2FuYWRvby5mcj7CRgQwEQIABgUC
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
LrwVhmCktc3AmA==
=5Tvd
-----END PGP PUBLIC KEY BLOCK-----
OpenPGP_signature.asc (application/pgp-signature, 203 B)
-----BEGIN PGP SIGNATURE-----

wmMEABEIACMWIQT5t6oMDaHvAeSVxeLF7Xcg2dUNigUCaH5r0gUDAAAAAAAKCRDF7Xcg2dUNipWH
AJ9m+RPYhdz9T89ogL/LXupljAbOKQCdHRUaz/VLeV2zZW8NktqCIB6QpNE=
=ETgh
-----END PGP SIGNATURE-----