[Final Summary] Proposal: Export Data.Word.Word from Prelude)

Herbert Valerio Riedel hvr at gnu.org
Sun Aug 31 16:07:55 UTC 2014


Hello again,

The proposal below succeeded by majority as well as by explicit
confirmation from the core libraries committee, and has landed 
in GHC HEAD as of

  http://git.haskell.org/ghc.git/commit/393b820233caa00e428affc28e090b496d181664


* Discussion Details

This proposal had the proponents below:

 - Anthony Cowley         +1
 - Carter Schonwald       +1
 - Daniel Díaz Casanueva  +1
 - Edward Kmett           +1
 - Herbert Valerio Riedel +1
 - Ivan Lazar Miljenovic  +1
 - Johan Tibell           +1
 - John Lato              +1
 - Michael Snoyman        +1
 - Sergei Trofimovich     +1

as well as the following explicit opponents:

 - Andreas Abel           -0.5  (past 2-week-period)
 - Ben Millwood           -1
 - Malcolm Wallace        -1(?) (past 2-week-period)

as well as discussion participants with no explicit vote I could
discern:

 - Bardur Arantsson       ?
 - Daniel Trstenjak       ?
 - David Feuer            ?
 - Evan Laforge           ?
 - Henning Thielemann     ?
 - Niklas Haas            ?


One of the concerns raised during the discussion was that the type name
'Word' had been poorly chosen. A suggestion was made to rename Word to
`UInt{,8,16,32,64}` and provide type-synonyms for backward
compatibility. Other naming suggestions that came up were 'Nat'
(imitating 'Int'/'Integer') or 'Cardinal'.

The other concern against promoting 'Word' into the default namespace
was the semantics of 'Word' due to '-' being prone to underflows (like
'Int', but at a different boundary), in combination with 'Word' being of
under-specified precision (in GHC, however, 'Word' is effectively
pointer-sized). Malcolm noted, the semantic aspect of a bounded 'Word'
(as well as 'Int') was controversial since its inception.

Please read the discussion thread in its entirety for the original
voices and other concerns I may not have properly articulated here (in
which case I'm sorry).


Cheers,
  hvr

On 2014-08-09 at 13:38:03 +0200, Herbert Valerio Riedel wrote:
> Hello *,
>
> Proposal
> --------
>
> I hereby propose to export Haskell2010's Data.Word.Word type from the Prelude
>
>
> Motivation
> ----------
>
> Starting with Haskell2010, "Data.Word" exporting the type 'Word', "an
> unsigned integral type, with the same size as 'Int'" became part of the
> Haskell Report. 
>
> 'Word' is usually a better choice than 'Int' when non-negative
> quantities (such as list lengths, bit or vector indices, or number of
> items in a container) need to be represented. Currently however, 'Word'
> is at a disadvantage (with respect to 'Int') in terms of public exposure
> by being accessible only after an "import Data.Word".
>
> Moreover, since 'Word' is now part of the Haskell Report, libraries
> should attempt to avoid name-clashing with 'Word' (and if they do, it
> ought to be a conscious decision, which ought to be declared by a
> requiring a "import Prelude hiding (Word)"). While one might think
> 'Word' would be a popular type-name to use in Haskell code, the current
> level of name collision is still rather low (as is shown in the next
> section), so the cost would still be bearable at this point in my
> opinion.
>
>
> Due diligence (w.r.t. code breakage impact)
> -------------------------------------------
>
> Packages depending on `haskell2010` or `haskell98` are not affected, and
> neither would be those depending on `base` with a PVP-suggested upper
> bound.
>
> However, to get a rough idea how widespread the use of 'Word' as a type
> on Hackage currently is, here's a simple check for current uses of
> 'Word' as a type-name performed with the simple heuristic search
>
>   find  -name '*.*hs*' -exec grep \
>      '\(data\|newtype\|type\)[[:space:]]\+Word[ =]' {} +
>
> over the unpacked source trees of the latest versions of the current
> 6766 packages on Hackage resulted in the following 43 packages being
> possibly affected (see specific source-code matches at end of email[1]):
>
>  1   adict-0.4.1
>  2   boxes-0.1.3
>  3   cjk-0.1.0.1
>  4   clash-prelude-0.5.1
>  5   combinat-0.2.5.0
>  6   concraft-pl-0.7.1
>  7   Craft3e-0.1.0.10
>  8   crf-chain1-0.2.2
>  9   crf-chain1-constrained-0.3.0
>  10  crf-chain2-generic-0.3.0
>  11  crf-chain2-tiers-0.2.1
>  12  delta-h-0.0.3
>  13  eros-0.6.0.0
>  14  estimators-0.1.4
>  15  estreps-0.3.1
>  16  FermatsLastMargin-0.1
>  17  fsmActions-0.4.4
>  18  gf-3.6
>  19  happraise-0.1
>  20  HAppS-Data-0.9.3
>  21  happstack-contrib-0.2.1
>  22  hist-pl-fusion-0.5.3
>  23  Holumbus-Searchengine-1.2.3
>  24  integer-pure-1.0
>  25  ixset-typed-0.3
>  26  language-bash-0.6.0
>  27  language-sh-0.0.3.1
>  28  lhc-0.10
>  29  MemoTrie-0.6.2
>  30  mpppc-0.1.3
>  31  nerf-0.5.2
>  32  regex-deriv-0.0.4
>  33  regex-pderiv-0.1.3
>  34  regexpr-symbolic-0.5
>  35  remote-0.1.1
>  36  soyuz-0.0.0
>  37  text-icu-0.6.3.7
>  38  text-register-machine-0.4.0
>  39  utf8-light-0.4.2
>  40  WordNet-1.1.0
>  41  WordNet-ghc74-0.1.3
>  42  xhaskell-library-0.0.6
>  43  york-lava-0.2
>
>
> Discussion period
> -----------------
>
> 2 weeks
>
>
> Footnotes
> ---------
>
>  [1] More specifically, here's the output of the above mentioned `grep` command:
>
> adict-0.4.1/src/NLP/Adict/Core.hs:type Word a = V.Vector a
> boxes-0.1.3/Text/PrettyPrint/Boxes.hs:data Word = Word { wLen :: Int, getWord  :: String }
> cjk-0.1.0.1/CJK/Data/CEDICT.hs:data Word = Word {
> clash-prelude-0.5.1/src/CLaSH/Tutorial.hs:type Word = Signed 4
> combinat-0.2.5.0/Math/Combinat/FreeGroups.hs:type Word a = [Generator a] 
> concraft-pl-0.7.1/src/NLP/Concraft/Polish/Morphosyntax.hs:data Word = Word
> Craft3e-0.1.0.10/Chapter7.hs:type Word = String
> Craft3e-0.1.0.10/Index.hs:type Word = String
> crf-chain1-0.2.2/Data/CRF/Chain1/Dataset/External.hs:type Word a = S.Set a
> crf-chain1-constrained-0.3.0/src/Data/CRF/Chain1/Constrained/Dataset/External.hs:data Word a b = Word
> crf-chain2-generic-0.3.0/Data/CRF/Chain2/Generic/External.hs:data Word a b = Word {
> crf-chain2-tiers-0.2.1/src/Data/CRF/Chain2/Tiers/Dataset/External.hs:data Word a b = Word {
> delta-h-0.0.3/src/EvalSem.hs:type Word = String
> eros-0.6.0.0/src/Text/Eros/Message.hs:type Word         = L.Text
> estimators-0.1.4/NLP/Probability/Example/Trigram.hs:newtype Word = Word T.Text 
> estreps-0.3.1/src/Repeats.lhs:-- type Word = Int
> FermatsLastMargin-0.1/FLM/WikiPages.hs:       newtype Word     = Word String
> fsmActions-0.4.4/Data/FsmActions.hs:newtype Word sy = Word [sy]
> gf-3.6/lib/src/finnish/wordnet/FreqFin.hs:type Word = String
> gf-3.6/treebanks/susanne/SusanneFormat.hs:type Word  = String
> gf-3.6/treebanks/talbanken/Format.hs:data Word     = W  {id :: Id, word :: String, pos :: Tag}
> happraise-0.1/Main.hs:type Word = String
> HAppS-Data-0.9.3/src/HAppS/Data/Atom.hs:    newtype Word = Word String
> happstack-contrib-0.2.1/src/Happstack/Contrib/Atom.hs:    newtype Word = Word String
> hist-pl-fusion-0.5.3/src/NLP/HistPL/Fusion.hs:type Word = T.Text
> Holumbus-Searchengine-1.2.3/src/Holumbus/Index/Common/BasicTypes.hs:type Word                       = String
> integer-pure-1.0/Data/Integer.hs:type Word    = Int    -- We fake the Word type, to avoid nasty conversions.
> ixset-typed-0.3/src/Data/IxSet/Typed.hs:    > newtype Word = Word String
> language-bash-0.6.0/src/Language/Bash/Word.hs:type Word = [Span]
> language-sh-0.0.3.1/Language/Sh/Syntax.hs:type Word = [Lexeme]
> lhc-0.10/lib/base/src/Data/Word.hs:type Word = Word32
> lhc-0.10/lib/base/src/GHC/Word.hs:data Word = W# Word# deriving (Eq, Ord)
> MemoTrie-0.6.2/src/Data/MemoTrie.hs:--     newtype Word :->: a = WordTrie ([Bool] :->: a)
> mpppc-0.1.3/src/Text/PrettyPrint/MPPPC/TwoDim/Combinators/Flow.hs:data Word s t = Printable s t =>
> nerf-0.5.2/src/NLP/Nerf/Types.hs:type Word = T.Text
> regex-deriv-0.0.4/Text/Regex/Deriv/ByteString/BitCode.hs:type Word = S.ByteString
> regex-deriv-0.0.4/Text/Regex/Deriv/ByteString/Posix.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/ByteString/LeftToRight.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/ByteString/LeftToRightD.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/ByteString/Posix.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/ByteString/RightToLeft.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/ByteString/TwoPasses.lhs:> type Word = S.ByteString
> regex-pderiv-0.1.3/Text/Regex/PDeriv/String/LeftToRightD.lhs:> type Word = String
> regexpr-symbolic-0.5/RegExpr/RegExprOperations.lhs:> type Word a = [a]
> remote-0.1.1/examples/tests/Test-MapReduce.hs:type Word = String
> remote-0.1.1/examples/kmeans/KMeans3.hs:type Word = String
> soyuz-0.0.0/DCPU16/Instructions.hs:data Word 
> text-icu-0.6.3.7/Data/Text/ICU/Break.hsc:data Word = Uncategorized       -- ^ A \"word\" that does not fit into another
> text-register-machine-0.4.0/Language/TRM/Base.hs:newtype Word = W [Letter] deriving (Eq, Monoid)
> utf8-light-0.4.2/src/Codec/Binary/UTF8/Light.hs:data Word = W# Word#
> WordNet-1.1.0/NLP/WordNet/Types.hs:type Word = String
> WordNet-ghc74-0.1.3/NLP/WordNet/Types.hs:type Word = String
> xhaskell-library-0.0.6/Text/Regex/PDeriv/ByteString/LeftToRight.lhs:> type Word = S.ByteString
> xhaskell-library-0.0.6/Text/Regex/PDeriv/ByteString/Posix.lhs:> type Word = S.ByteString
> xhaskell-library-0.0.6/Text/Regex/PDeriv/ByteString/RightToLeft.lhs:> type Word = S.ByteString
> xhaskell-library-0.0.6/Text/Regex/PDeriv/ByteString/TwoPasses.lhs:> type Word = S.ByteString
> york-lava-0.2/modules/Lava/Prelude.hs:type Word n = Vec n Bit

-- 
"Elegance is not optional" -- Richard O'Keefe


More information about the Libraries mailing list