Семейства типов Haskell, понимание сообщения об ошибке

При попытке использовать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 )нет, и почему?

5
задан Clinton 7 May 2012 в 09:46
поделиться