Подтвердить что ты не робот

Множественные объявления x

У меня есть этот код, и он не будет компилироваться, выделяя права x и y для Point3 и записывая: "Несколько объявлений x" и "Множественные объявления y". Что не так? Не можете ли Point2 и Point3 иметь одно и то же имя участника?

data Point2     = Point2 {x :: Float, y :: Float}
data Point3     = Point3 {x :: Float, y :: Float, z :: Float}
4b9b3361

Ответ 1

Нет, это в настоящее время не поддерживается. Стандартным подходом является префикс каждого поля с чем-то уникальным для конкретного типа данных, например. p2x, p2y, p3x и т.д.

Причина, по которой это не поддерживается, заключается в том, что каждое имя поля записи неявно генерирует функцию "селектора", например. x :: Point2 -> Float. Наличие двух полей с тем же именем в одном и том же поле создаст столкновение.

Это многолетний жучок для многих людей и будет рассмотрен предстоящим расширением языка OverloadedRecordFields, который, мы надеемся, будет частью от GHC 7.12 (ожидается в начале 2016 года).

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

Ответ 2

Расширение DuplicateRecordFields позволяет существующим записям Haskell использовать двойные метки полей.

См. DuplicateRecordFields

OverloadedRecordFields не работает для меня с ghc-8.0.2