Соответствие шаблону формы: Option {..} <-

Какова эта форма соответствия шаблонов: Option{..} <- ..., например. как он используется здесь:

data Option = Option { cabal :: Maybe String , noStylish :: Bool }
...
main = do
  Option{..} <- cmdArgs defOption
  cabp <- case cabal of
    Nothing -> do
    ...

Кажется, переопределяет cabal и nostylish. Перед совпадением шаблона cabal имеет тип Option -> Maybe String, но после него имеет тип Maybe String.

Этот пример исходит из недавно загруженного пакета cabal2ghci.

Ответ 1

Это синтаксическое расширение GHC, называемое групповыми символами. Котировочная документация:

Записать синтаксис подстановочных знаков позволяет a ".." в шаблоне записи, где каждое исключенное поле f заменяется шаблоном f = f.

Итак, этот код эквивалентен

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

эффективно привязать имя x к значению поля записи с именем x для каждого поля в типе записи.

<- часть здесь не имеет значения, вы также можете написать

let Option { .. } = some expression