pattern matching of the form: Option{..} <-

haskell, pattern-matching

Solution

This is a GHC syntactic extension called record wildcards. Quoting documentation:

Record wildcard syntax permits a `".."` in a record pattern, where each elided field `f` is replaced by the pattern `f = f`.

So this code is equivalent to

Option { cabal = cabal, noStylish = noStylish } <- cmdArgs defOption

effectively binding name `x` to the value of record field named `x` for every field in the record type.

`<-` part is irrelevant here, you can as well write

let Option { .. } = some expression

Problem

What is this form of pattern matching called:`Option{..} <- ...`, e.g. as it is used here: ``` data Option = Option { cabal :: Maybe String , noStylish :: Bool } ... main = do Option{..} <- cmdArgs defOption cabp <- case cabal of Nothing -> do ... ``` It seems to redefine `cabal` and `nostylish`. Before the pattern match `cabal` has type `Option -> Maybe String` but after it has type `Maybe String`. This example comes from the recently uploaded package `cabal2ghci`.

Original source