При попытке использоватьData.Has
я писал код, подобный следующему:
data Name = Name; type instance TypeOf Name = Text
type NameRecord = FieldOf Name;
Я нашел:
instance I NameRecord where
...
Выдает ошибку компиляции, а именно:
Недопустимое приложение семейства синонимов типа в экземпляре
Принимая во внимание, что:
instance (NameRecord ~ a) => I a where
...
Компилируется нормально.
Я считаю, что ошибка связана с этим билетом в GHC, помеченным как недействительный.
Ответ на тикет говорит:
Я не уверен, что вы предлагаете. Мы не можем автоматически Преобразование
instance C (Fam Int) -- (1)
в
instance (Fam Int ~ famint) => C famint -- (2)
Это работает, если есть только один экземпляр, но как только есть два такие случаи, они всегда перекрываются.
Может быть, вы предлагаете, чтобы мы все равно сделали это, а программисты следует просто учитывать неявное преобразование. Я не думаю, что это хорошая идея. Это сбивает с толку очень мало пользы (так как вы всегда можете самостоятельно написать преобразованный экземпляр с небольшими затратами. усилие ).
Может ли кто-нибудь уточнить это объяснение, возможно, с некоторым примером кода, где (1 )терпит неудачу, а (2 )нет, и почему?