[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