Я говорю о том, что определить невозможно:
data A = A {name :: String}
data B = B {name :: String}
Я знаю, что GHC просто снимает это с простых функций, и идиоматический способ решить это будет:
data A = A {aName :: String}
data B = B {bName :: String}
class Name a where
name :: a -> String
instance Name A where
name = aName
instance Name B where
name = bName
После того, как я написал это, мне не нравится, что... не может ли эта классификация быть частью процесса desugaring?
Эта мысль пришла ко мне, когда я писал синтаксический анализ Aeson JSON. Там, где было бы просто просто выводить экземпляры FromJSON
для каждого типа данных, я должен был написать все вручную (в настоящее время > 1k строк и подсчет).
Наличие таких имен, как name
или просто value
в записи данных, не так уж редко.
http://www.haskell.org/haskellwiki/Performance/Overloading упоминает, что перегрузка функций вводит некоторые служебные данные во время выполнения. Но я на самом деле не понимаю, почему компилятор не сможет решить это во время компиляции и дать им разные имена внутри.
Даже если будет некоторая часть служебных обязанностей во время выполнения, большинство людей не возражают против того, что большинство кода вряд ли критично для производительности.
Есть ли скрытое расширение языка, которое на самом деле позволяет это? Опять я не уверен... но я думаю, что Идрис на самом деле это делает?