[ghc-steering-committee] #380 GHC2021: Voting starts

Simon Peyton Jones simonpj at microsoft.com
Mon Nov 30 16:54:27 UTC 2020


My votes.  I'm using Iavor's categorisation.

Many of these I don't feel strongly about.

Simon


Module System
=============

ImportQualifiedPost: yes
-- ^ This is relatively new, but it seems quite simple, and it does make
-- things read nicer.

-- | These are only needed under very special circumstances,
-- so it's good to be explicit:
PackageImports: no
NoImplicitPrelude: no


Notation
========

BlockArguments: no
-- ^ I prefer the extra parens

MultiWayIf: no
LambdaCase: no
-- ^ There is an on-going dicussion about \of,
-- whose outcome I don't want to pre-judge

-- | The various literal notations seem useful when you need them
-- and don't conflict with anything.
BinaryLiterals: yes
HexFloatLiterals: yes
NumericUnderscores: yes
NumDecimals: maybe

OverloadedStrings: yes
OverloadedLists: yes
-- | ^ These go together

OverloadedLabels: no
-- | ^ Still rather experimental

EmptyCase: yes
-- ^ Simple, useful, no conflicts

PostfixOperators: yes
LexicalNegation: maybe
UnicodeSyntax: maybe

NegativeLiterals: no
-- ^ It seems that `LexicalNegation` might be a nicer way to do this?

TupleSections: maybe
-- ^ I don't use this often, but I'd use it more often if it was on by default.

ImplicitParams: no
-- ^ I find these quite useful on occasion, but it does seem reasonable
-- to be explicit when you need them.

ParallelListComp: yes
-- ^ I find these to be a very nice generalization to list comprehensions
-- that makes some code way more readable than using `zip/zipWith`, just
-- like comprehensions are often nicer than `map` or `concatMap`

RecursiveDo: yes
-- ^ Seems useful when you need it, and it doesn't clash with anything,
-- so I see no reason to not have it on all the time.

TransformListComp: no
-- ^ In my mind these are just a bit too much syntactic sugar.

Arrows: no
-- ^ Big feature; if you want it, ask for it

ApplicativeDo: no
-- ^ Does not seem to have settled yet

QualifiedDo: no
-- ^ This is neat, but it is too new to be on by default.

MonadComprehensions: maybe
-- ^ I never really use these.
-- On occasion I've wanted `ApplicativeComprehensions` though.

NondecreasingIndentation: no
-- ^ This always felt like a hack to me.

RebindableSyntax: no
-- ^ Definitely not by default!

ExplicitNamespaces: maybe
-- ^ We need this if we also want pattern synonyms.


Data Types
==========

DatatypeContexts: no
-- ^ These are not really used much, and usually don't do what people expect.

ExistentialQuantification: yes
-- ^ This is quite useful, and has been around for a long time.

EmptyDataDecls: yes
-- ^ Seems more consistent to allow this

RoleAnnotations: yes
-- ^ Useful in the same way that type signatures are

StrictData: no
-- ^ Obviously not by default

GADTSyntax: yes
-- ^ I personally don't use this, but I know some folks like to write
-- their `data` declarations in this notation.

GADTs: no
-- ^ These can be useful, but it seems reasonable to enable them when
-- you need them, as they bring in quite a lot of machinery with them.


Patterns and Guards
===================
BangPatterns: yes
-- ^ Seem to be useful, and quite popular.

ViewPatterns: yes
-- ^ Useful on occasion, and I don't think calling out the extension
-- explicitly helps anyone.

PatternSynonyms: no
-- ^ These are quite useful, but I am not sure how stable is their design.

NoPatternGuards: no
-- ^ Conflicts with Haskell2010

NPlusKPatterns: no
-- ^ Conflicts with Haskell2010


Records
=======

-- | Useful abbreviation
NamedFieldPuns: yes

--| Makes it harder to determine binding site
RecordWildCards: no

-- | These seem to be largely about experimenting with new record
system, and I don't think any of them are quite ready to be on by default:
DisambiguateRecordFields: no
DuplicateRecordFields: no
NoTraditionalRecordSyntax: no


Deriving
=======

-- | Declaring these as extensions explicitly adds very little information.

EmptyDataDeriving: yes
-- ^ Useful for consistency

StandaloneDeriving: yes
-- ^ I find this quite useful on occasion, and does not conflict with anything


-- | Deriving particular classes
-- No harm in these
DeriveGeneric: yes
DeriveLift: yes
DeriveDataTypeable: yes
DeriveFunctor: yes
DeriveFoldable: yes
DeriveTraversable: yes

-- | Deriving methods
-- I'm less convinced that these are stable
DerivingStrategies: no
DerivingVia: no
GeneralisedNewtypeDeriving: no
DeriveAnyClass: no


Class System
============

MultiParamTypeClasses: yes
-- ^ Seems like a natural extension and does not really conflict with anything

NullaryTypeClasses: yes
-- ^ Seems like a natural extension and does not really conflict with anything

ConstraintKinds: yes
-- ^ These seem like a very nice fit with the rest of the kind system,

-- | These 3 seem to be quite common.  There are some reasons to be careful
-- when writing `FlexibleInstances`, but it seems that having the extension
-- does not really help much with those.
TypeSynonymInstances: yes
FlexibleInstances: yes
FlexibleContexts: yes

-- | A simple and useful generalisation
ConstrainedClassMethods: yes

-- | A bit more complicated
DefaultSignatures: no

-- | Simple and useful
InstanceSigs: yes

-- | This is mainly for GHCi; don't want this on by default!
ExtendedDefaultRules: no

FunctionalDependencies: no
-- ^ While I quite like the general idea here, I don't think we should
-- have these on by default.

QuantifiedConstraints: no
-- ^ These seem neat, but are quite new to be on by default.

UndecidableInstances: no
-- ^ These are a very special case, and ideally should be specified
-- on a per instance basis.

IncoherentInstances: no
-- ^ Why do we even have this? :)

UndecidableSuperClasses: no
-- ^ These are a very special case.

OverlappingInstances: no
-- ^ This has been subsumed by per-instance pragmas

Types
=====

RankNTypes: yes
-- ^ These are useful and have been around for a long time.  The design
-- seems to work well.

-- | These two seem useful, but I am not sure if they should be on by default.
-- If so, though, it makes sense to have both of them on.
StandaloneKindSignatures: yes
KindSignatures: yes

LiberalTypeSynonyms: maybe
-- ^ These seem useful, but can lead to some rather confusing situations
-- where types that look "normal" don't behave as you'd expect
-- (e..g, writing `[T]` fails because `T` happens to have `forall` in it)

-- | These two go together and seem quite useful, especially when writing
-- local type signatures.
ScopedTypeVariables: yes
ExplicitForAll: yes

AllowAmbiguousTypes: no
-- ^ Often these are unintentional, and are due to a mistake in the program.

ImpredicativeTypes: no
-- ^ Fairly new

MonoLocalBinds: yes
-- ^ Switched on by TypeFamilies; let's have it all the time
-- But debatable

NoMonomorphismRestriction: yes
-- ^ The monomrphism restriction seems to cause a lot of confusion, and I
-- am not sure that it's helped that much with efficiency

-- | Doesn't really seem to be commonly used.
PartialTypeSignatures: no
NamedWildCards: no

LinearTypes: no
-- ^ Too new to be standardized

TypeApplications: yes
-- ^ Super useful!

-- | These are all related to type-level programming, and while I don't think
-- they should be on by default, it might be useful to have a single flag that
-- turns a bunch of them on.
PolyKinds: yes
TypeOperators: yes
StarIsType: yes

-- More complicated
TypeFamilies: no
TypeFamilyDependencies: no
DataKinds: no

FFI
===
I don't think the FFI should be on by default, as it is used relatively
infrequently, although it might be nice if `ForeignFunctionInterface`
implied `CApiFFI`

ForeignFunctionInterface: no
CApiFFI: no
GHCForeignImportPrim: no
InterruptibleFFI: no
UnliftedFFITypes: no
StaticPointers: no


Low Level
=========

These are for low-level hacking, so I don't think they should be
on by default.  However, I wouldn't mind having a flag that enabled
all of them with a single extension (e.g., `UnliftedTypes`)

UnboxedSums: no
UnboxedTuples: no
MagicHash: no
UnliftedNewtypes: no

Macros
======

CPP: no
This is quite specialized, so it seems reasonable to be explicit about it.


I don't think these should be on by default, but I wouldn't mind it
if `TemplateHaskell` implied `QuasiQuotes`, so that when I use TH
I just need to turn on a single extension.:

TemplateHaskell: no
TemplateHaskellQuotes: no
QuasiQuotes: no


Other
=====

-- | These are part of Safe Haskell and are there to be written explicitly
Unsafe: no
Safe: no
Trustworthy: no


Strict: no
-- ^ This is not Haskell! :-)

Obsolete/Deprecated
===================
CUSKs: no
TypeInType: no
MonadFailDesugaring: maybe




More information about the ghc-steering-committee mailing list