问题
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.
回答1:
This is a GHC syntactic extension called record wildcards. Quoting documentation:
Record wildcard syntax permits a
".."in a record pattern, where each elided fieldfis replaced by the patternf = 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
来源:https://stackoverflow.com/questions/18372188/pattern-matching-of-the-form-option