-
OverloadedRecordDot -
- Since:
-
9.2.0
Обеспечивает синтаксис записи ‘.’, например,
x.foo
При включенном OverloadedRecordDot, можно записать a.b, что означает поле b записи a.
Пример:
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE DuplicateRecordFields #-}
data Person = Person { name :: String }
data Company = Company { name :: String, owner :: Person }
main = do
let c = Company { name = "Acme Corp."
, owner = Person { name = "Wile E. Coyote" } }
print $ c.name ++ " is run by " ++ c.owner.name
Также можно записать (.b), что означает функцию, «проектирующую» поле b из своего аргумента. Например, (.b) a означает то же самое, что и a.b.
OverloadedRecordDot обычно реализуется путем преобразования выражений записей . в выражения GHC.Records.getField. Включение OverloadedRecordDot и RebindableSyntax вместе позволяет преобразовать выражения . в собственные реализации getField.
При рассмотрении a.b, поле b, которое подразумевается, определяется путем решения ограничений HasField. См. Решение ограничений HasField.