haskell вариант записей с разными именами полей - PullRequest
3 голосов
/ 15 февраля 2012

Учитывая это:

data Foo = Bar { name :: String } | Baz { nickname :: String }

Обе функции name и nickname имеют вид Foo -> String:

:t name
name :: Foo -> String

:t nickname
nickname :: Foo -> String

Однако определения являются неполными, поскольку оба следующих выражения вызовут ошибки сопоставления с образцом:

name $ Baz { nickname = "Bob" }
nickname $ Bar { name = "Fred" }

Можно ли завершить определения name и nickname, то есть что-то вроде:

name Baz { nickname = n } = ...

nickname Bar { name = n } = ...

Попытка сделать это в объятиях приводит к ошибкам типа «Несколько объявлений для имени переменной».

Ответы [ 2 ]

5 голосов
/ 15 февраля 2012

Нет, это невозможно.Имена полей являются функциями верхнего уровня по отношению к области видимости и поэтому не могут быть переопределены или расширены.Сделать их полными функциями так же невозможно, как сделать head единицу.

3 голосов
/ 15 февраля 2012

Попробуйте расширение - XDataKinds , оно позволяет рекламировать конструкторы данных как разновидности.

Обратите внимание, что вам понадобится GHC 7.4.1, выпущенный всего 12 дней назад.,Самое время задать этот вопрос!

...