Основной вопрос о записях Haskell. Если я определяю этот тип данных,
data Pet = Dog { name :: String } | Cat { name :: String } deriving (Show)
следующие работы:
main = do
let d = Dog { name = "Spot" }
c = Cat { name = "Morris" }
putStrLn $ name d
putStrLn $ name c
Но если я сделаю это,
data Pet = Dog { name :: String } | Cat { name :: Integer } deriving (Show)
Я получу эту ошибку: Multiple declarations of 'name'
.
Я думаю, что интуитивно понимаю, почему это должно быть так, поскольку тип name
в первом случае — это просто Pet -> String
независимо от используемого конструктора. Но я не припоминаю, чтобы встречал это правило о функциях доступа к записям ни в одной из книг по Haskell, которые я читал. Может ли кто-нибудь дать более подробное объяснение поведения, которое я вижу выше?