
Hello Henning, On 2014-08-09 at 21:25:50 +0200, Henning Thielemann wrote: [...]
Furthermore Word (like Int) has no protection against overflow, e.g. (-1 :: Word) is accepted without any warnings.
Like Int*, all Word*-typed literals are checked as well[1]. But for some reason I haven't investigated (possibly a bug) the check fails for small negative values unless -XNegativeLiterals is active: Prelude> (0xfffffffffffffffff::Data.Word.Word) <interactive>:2:2: Warning: Literal 295147905179352825855 is out of the GHC.Types.Word range 0..18446744073709551615 18446744073709551615 Prelude> (-0xfffffffffffffffff::Data.Word.Word) <interactive>:3:3: Warning: Literal 295147905179352825855 is out of the GHC.Types.Word range 0..18446744073709551615 1 Prelude> (-1::Data.Word.Word) 18446744073709551615 Prelude> :set -XNegativeLiterals Prelude> (-1::Data.Word.Word) <interactive>:6:2: Warning: Literal -1 is out of the GHC.Types.Word range 0..18446744073709551615 18446744073709551615
I don't have any concrete suggestions for improving this that aren't somewhat groan worthy (eg type UInt = Word), but perhaps someone else might at least offer some comforting words. (Sorry)
Modula calls non-negative integers CARDINAL. I like the name. In Haskell there could be a Cardinal type for arbitrary size non-negative integers and Card for machine size integers, although the latter one could be misunderstood as cards used in card games.
Fwiw, I did wonder back then why Wirth chose the term 'cardinal' over e.g. 'natural'. However, the thing is, 'Word' is already part of the Haskell Report (and before that had been established already via the FFI addendum), and it's already adopted widely (grep found " Data.Word" mentioned in 1365 of 6766 packages). So the type-name 'Word' meaning unsigned fixed-width integral is not going away that soon. Cheers, hvr [1]: https://github.com/ghc/ghc/blob/1fc60ea1f1fd89b90c2992d060aecb5b5a65f8c0/com...