Proposal: Export Data.Word.Word from Prelude

Anthony Cowley acowley at seas.upenn.edu
Sat Aug 9 19:15:27 UTC 2014


While I am +1 on this idea, I think it's worth acknowledging an unfortunate aspect of the name. The name "Word" has good reason, but, without any context, reasonable people will guess it has something to do with Strings. Add to this that other names like "uint" or its more verbose form are perhaps more common among programming languages. When given a numeric suffix, such as Word8 or Word32, some of the ambiguity is shed, but here we would instead see the unadorned name in many places.

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)

Anthony

> On Aug 9, 2014, at 7:38 AM, Herbert Valerio Riedel <hvr at gnu.org> 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:
> 
> --8<---------------cut here---------------start------------->8---
> 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
> --8<---------------cut here---------------end--------------->8---
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries


More information about the Libraries mailing list