2014-12-02 2 views
0

я не мог сделать следующую компиляцию:ограничение класса в определении любезных данных

class Typeable f => Foo f where 
    data Bar :: Typeable 

Другими словами, я хотел бы определить класс Foo, которые имеют соответствующий тип, который должен быть экземпляром Typeable.

Похоже, я могу определить то же самое с FunctionalDependencies:

class (Typeable b,Typeable f) => Foo f b | f -> b where 

Так как я могу сделать то же самое с TypeFamilies?

+1

ли вы имеете в виду ассоциативный тип или связанные с ним данные? Разница довольно фундаментальна, и этот вопрос имеет больший смысл, если вы имеете в виду ассоциированный тип. То есть 'type Bar ...' в определении класса. Сравнение с fundeps просто не работает со связанными данными. – Carl

+0

Фактическое требование больше похоже на связанные данные, так как 'Bar' будет определяться одновременно с экземпляром' Foo'. –

ответ

3

Я не проверял, но я считаю, что это должно работать:

class (Typeable f, Typeable (Bar f)) => Foo f where data Bar f :: * 
+0

Это прекрасно работает, спасибо. –