Skip to content

Deprecate `optional` from Text.ParserCombinators.ReadP

It seems there is some disagreement on what the type of optional should be, within base.

Control.Applicative defines it as

optional :: Alternative f => f a -> f (Maybe a)

By contrast, Text.ParserCombinators.ReadP defines it as

optional :: ReadP a -> ReadP ()

Worse, ReadP implements Alternative. So it entirely possible to specialise

optional :: ReadP a -> ReadP (Maybe a).

In the broader Haskell ecosystem (and beyond) there is further confusion. The Applicative definition is used by parsers, megaparsec and purescript's Data.Maybe. The ReadP definition is used by Parsec and purescript's Text.Parsing.StringParser. Cabal, like base defines both.

I propose to begin to deprecate ReadP.optional ASAP, following suggestions in https://www.reddit.com/r/haskell/comments/8cqgds/inconsistent_optional_definitions/. Code which used the old form may still compile; otherwise void should be applied.

There have been some suggestions for new names for the ReadP definition, such as optionally or optional_. It may be worth exporting this function directly from Control.Applicative.

Trac metadata
Trac field Value
Version 8.6.2
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component libraries/base
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information