2016-08-14 2 views
11

Допустим, у меня есть инъективное семейство типа TОбратные семейства инъективны типа

type family T a = b | b -> a 

Мой первый вопрос есть ли способ, чтобы написать:

type family T' = the inverse of T 

без необходимости повторять все экземпляры T но в обратном порядке.

Такой, что: T (X1 a (T' a)) = a

Похоже, это должно работать, так как оба T и T' инъективны, учитывая одна сторона это механическое, чтобы работать другой.

В любом случае, написать T'?

+2

Не было бы ' ~ T b' work? – mb14

+0

Очевидно, что тип Tinv b = a' отклоняется, потому что tyvar 'a' должен упоминаться в аргументах' Tinv', который выглядит слишком ограничительным, когда он определяется ими благодаря фондам в объеме. – chi

+1

Невозможно преобразовать fundep в явное семейное приложение типа, но, как сказал @ mb14, используя ограничение равенства в сигнатуре типа, вы можете вычислить обратное - например. '(a ~ T b) => Прокси a -> Прокси b' или эквивалентно' Proxy (T b) -> Proxy b'. – user2407038

ответ

6

С помощью соответствующих расширений, можно написать:

type T' b = forall a. T a ~ b => a 

Например, вот пример, показывающий, что вы получите по крайней мере, основной совместимости типа с этим типом синоним:

type family T a = b | b -> a 
type instance T Int = Bool 

f :: T' Bool -> Int 
f x = x 
Смежные вопросы