Учитывая это:
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 } = ...
Попытка сделать это в объятиях приводит к ошибкам типа «Несколько объявлений для имени переменной».