2016-12-13 11 views
3

Можно ли указать, что каждый член datakind удовлетворяет классу типов, так что подразумевается ограничение класса? Например.Typeclass, созданный при каждом значении типа данных

data AB = A | B 
class Foo (a :: AB) where get :: proxy a -> String 
instance Foo A where get _ = "A" 
instance Foo B where get _ = "B" 

-- note lack of constraint here 
get' :: proxy (a :: AB) -> String 
get' = get 

В основном a является AB поэтому мы уверены, что есть экземпляр Foo для него. Я нахожу это маловероятным - где он собирается получить словарь Foo? - но я видел волшебство в свое время.

+0

Я закрыл это как дубликат http://stackoverflow.com/questions/32408110/datakinds-and-type-class-instances, но вновь его. Отдельный класс 'Foo', ограниченный работой только с' AB', может оставить место для магии, я не могу себе представить. – Cirdec

ответ

6

Нет, вы не можете этого сделать. Основная проблема заключается в том, что, как вы уже упоминаете, нет ничего, чтобы получить словарь. Но другая проблема заключается в том, что ваше утверждение о том, что каждый тип в AB является экземпляром Foo, неверно.

type family Broken :: AB where 
+0

Или 'GHC.Exts.Any :: AB'. – Alec

+0

Интересно, я не считал, что у всех видов может быть «дно», которое, несомненно, придавало бы смысл семантически. Тогда имеет смысл ограничить типы нормальной формы, возможно, с классом «NF k», который затем может быть использован для предоставления необходимых словарей. Хммм .... в любом случае, спасибо за прозрение – luqui

+0

@luqui, синглтон будет делать. 'данные ABy x, где Ay :: ABy 'A; By :: ABy 'B'. Если вам нравится, 'class KnownAB x, где известен AB :: ABy x'. Совпадение шаблонов на 'knownAB' позволяет использовать экземпляры. – dfeuer