[ghc-steering-committee] #380 GHC2021: Vote update

Joachim Breitner mail at joachim-breitner.de
Mon Dec 14 22:43:19 UTC 2020

Another update:

NegativeLiterals: no
  -- ^ The latest docs paint an incomplete picture of this, and make it look
  like it only affects desugaring of “negate followed by literal”. But it does
  more, affects parsing, changes `x-1`, and changes meaning in 9.0.
  So (unfortunately), no. Thanks Iavor for pointing that out on kiala.com

MonoLocalBinds: no
TypeFamilies: no
  -- ^ Not uncontentious, as per Richard’s plea

PolyKinds: yes
  -- ^ Got convinced by Richard


Unchanged votes follow:

CUSKs: no
StandaloneKindSignatures: yes
  -- ^ A change from Haskell2010, but in a corner where the target
       audience probably prefers progress

NoMonomorphismRestriction: no
  -- ^ MonomorphismRestriction in Haskell2010, I have no reason to change that

Controversial and/or pleaded against:

ViewPatterns: no (convinced by SPJ)
GADTs: no (too controversial)
ExistentialQuantification: no (convinced by Richard)

PostfixOperators: yes

NamedWildCards: yes
 -- ^ Following Alejandro here: Seems safe and maybe more useful if
      it can be used without friction.

ForeignFunctionInterface: yes
 -- ^ As Simon M points out, this is part of Haskell2010, and
      was put on the ballet in this form (rather than
      NoForeignFunctionInterface) by accident. I do not want to remove
      anything that’s there (and I assume that nobody does without
      making that very explicit).

ImportQualifiedPost: yes
 -- ^ Personally don’t care a lot about it, but I don’t want to veto it
      either, so following Iavor here.

HexFloatLiterals: yes
 -- ^ More syntax for literals doesn’t hurt

I’d also like to advocate for UnicodeSyntax, with the implied provision that -XGHC2021 will make GHC accept unicode syntax, but without writing error messages using it (i.e. no implied -fprint-unicode-syntax). I hope that at least those who have this on maybe (Alejandro, Arnaud, Iavor and SPJ) might be swayed by that clarification.

Unchanged votes follow:

Let’s first get all those out of the way that are too contentions
according to the data (with 2*no>yes votes):

My starting point here was:
*Main> putStr $ unlines [ ext ++ ": no" | E{..} <- M.elems exts, survey_no > 10, survey_no * 2 > survey_yes ]

And that gave me the following:

AllowAmbiguousTypes: no
ApplicativeDo: no
Arrows: no
BlockArguments: no
CApiFFI: no
CPP: no
ConstrainedClassMethods: no
DatatypeContexts: no
DisambiguateRecordFields: no
DuplicateRecordFields: no
ExplicitNamespaces: no
ExtendedDefaultRules: no
ImplicitParams: no
ImpredicativeTypes: no
IncoherentInstances: no
InterruptibleFFI: no
LiberalTypeSynonyms: no
MagicHash: no
MonadComprehensions: no
NPlusKPatterns: no
NoImplicitPrelude: no
NoPatternGuards: no
NoTraditionalRecordSyntax: no
NullaryTypeClasses: no
NumDecimals: no
 -- ^ Unsure about this one
OverlappingInstances: no
OverloadedLabels: no
OverloadedLists: no
PackageImports: no
ParallelListComp: no
PartialTypeSignatures: no
 -- ^ Unsure about this one, but trusting the crowd until convinced 
QuantifiedConstraints: no
QuasiQuotes: no
RebindableSyntax: no
RecursiveDo: no
 -- ^ I like that one. But probably not widespread enough.
StaticPointers: no
Strict: no
StrictData: no
TemplateHaskell: no
TemplateHaskellQuotes: no
TransformListComp: no
Trustworthy: no
TypeFamilyDependencies: no
TypeInType: no
TypeSynonymInstances: no
UnboxedSums: no
UnboxedTuples: no
UndecidableInstances: no
UndecidableSuperClasses: no
Unsafe: no

Actually, some of them I disagree with, and believe they are safe to
turn on by default, and would be happy to, with sufficient committee

RoleAnnotations: yes
UnicodeSyntax: yes
  -- ^ I ❤ unicode
UnliftedNewtypes: yes
  -- ^ or is there something wrong with that?

Now to those with at least 20% popularity:

*Main> putStr $ unlines [ ext ++ ": no" | E{..} <- M.elems exts, not (survey_no > 10 && survey_no * 2 > survey_yes), 5 * survey_yes > survey_total  ]

These I happily go with, until I learn otherwise:

BangPatterns: yes
ConstraintKinds: yes
DataKinds: yes
DeriveDataTypeable: yes
DeriveFoldable: yes
DeriveFunctor: yes
DeriveGeneric: yes
DeriveTraversable: yes
DerivingStrategies: yes
DerivingVia: yes
FlexibleContexts: yes
FlexibleInstances: yes
GeneralisedNewtypeDeriving: yes
KindSignatures: yes
LambdaCase: yes
MultiParamTypeClasses: yes
RankNTypes: yes
StandaloneDeriving: yes
TupleSections: yes
TypeApplications: yes
TypeOperators: yes

There are some where I disagree with the crowd:

ScopedTypeVariables: no
  -- ^ Too much of a kitchen sink, some edges are rough, and some of 
       its semantics (“bind type signatures unless in scope”) are being

       If we had the plain PatternSignatures as a separate extension,
       I’d vote that in though. If ScopedTypeVariables doesn't make it
       this round, I will revive #119 to get that.

OverloadedStrings: no
  -- ^ yes, has many fans. But I believe that many might actuall
       use that although what they really want is a monomorphic

         "foo" :: Text

       and I wonder if there is a way to give them that.

       Also, some report that too much polymorphism can hurt, e.g. in

         is_vowel c = c `elem` "aeiou"

       Three is also 12% Aloofness and 12% Contentionsness, which are
       not to be dismissed.

       So I am inclined to leave this out, for this round at least.

MultiWayIf: no
  -- ^ in light of discussion around a multi-case, maybe premature

The remaining ones,
*Main> putStr $ unlines [ ext ++ ": yes" | E{..} <- M.elems exts, not
(survey_no > 10 && survey_no * 2 > survey_yes), not (5 * survey_yes >
survey_total)  ]

Kinda clear:

BinaryLiterals: yes
DeriveLift: yes
EmptyCase: yes
EmptyDataDecls: yes
EmptyDataDeriving: yes
ExplicitForAll: yes
GADTSyntax: yes
  -- ^ In case GADTs don’t make it
InstanceSigs: yes
NamedFieldPuns: yes
NondecreasingIndentation: yes
  -- ^ It’s Haskell98
and the current default(!), but not Haskell2010?
NumericUnderscores: yes
RecordWildCards: yes
UnliftedFFITypes: yes
StarIsType: yes
  -- ^ It’s the default now. Probably too early to turn off!

DefaultSignatures: no
  -- ^ Deriving via is probably preferrable these days
DeriveAnyClass: no
LinearTypes: no
PatternSynonyms: no
  -- ^ I like them, but maybe a bit too early
MonadFailDesugaring: no
  -- ^ This extension is temporary, and will be deprecated in a future
QualifiedDo: no
Safe: no

No expert on these, will read your rationales:

FunctionalDependencies: maybe
GHCForeignImportPrim: maybe
LexicalNegation: maybe
  -- ^ Unsure about the maturity of the whitespace sensitiviy trend

Joachim Breitner
  mail at joachim-breitner.de

More information about the ghc-steering-committee mailing list