2016-08-14 12 views
11

yazmak için bir yol yoktur ben TTers injective tip ailelerin

type family T a = b | b -> a 

ilk sorum bir injective tip aile var Diyelim:

type family T' = the inverse of T 

T tüm örneklerini tekrarlamak zorunda kalmadan ama geri viteste.

Öyle ki: bu çalışması gerekir gibi iki T ve T' injektif gibi T (X1 a (T' a)) = a

O diğer çalışmak mekaniktir bir tarafı verilen görünüyor.

neyse T' yazmak için? Uygun uzantılarıyla

+2

olmaz mıydı 'a ~ Çalışmak mı? tyvar 'a' onlar tarafından kapsamındaki fundeps sayesinde tespit edildiğinde çok sınırlayıcı görünüyor' Tinv', bir argüman olarak söz gerekmektedir, çünkü – mb14

+0

Görünüşe 'tipi TINV b = a' reddedilir. – chi

+1

açık bir tip aile uygulamasına fundep dönüştürmek mümkün değildir, ancak @ gibi mb14 Eğer tersini hesaplayabilir bir tip imzasında bir eşitlik kısıtlama kullanarak, dedi - örneğin '(a ~ Tb) => Vekil a -> Vekil b' veya eşdeğer Pro Proxy (Tb) -> Proxy b'. – user2407038

cevap

6

, tek yazabilirsiniz: Örneğin

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

aşağıda bir örnek bu tip eşanlamlı ile en azından temel tipi uyumluluk elde gösteren var:

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

f :: T' Bool -> Int 
f x = x