Cebirsel polimorfizmi çeviri
Türleri temel cebirsel yorumu ben anlayamıyorum:
Either a b ~ a b
(a, b) ~ a * b
a -> b ~ b^a
() ~ 1
Void ~ 0 -- from Data.Void
... ve bu ilişkileri beton türleri için geçerli, gibi a
gibi polimorfik etkende Bool
,. Ben de sadece aşağıdaki izomorfizm göre Kilise kodlama çevirerek beton türü kendi sunumlarını polimorfik türleri ile tür imzaları nasıl çevireceğini bilir:
(forall r . (a -> r) -> r) ~ a
Eğer var ise:
id :: forall a . a -> a
id ~ a^a
, ama aslında demek anlamına gelmez biliyorum:
id :: forall a . (() -> a) -> a
id ~ ()
~ 1
Benzer:
pair :: forall r . (a -> b -> r) -> r
pair ~ ((a, b) -> r) - > r
~ (a, b)
~ a * b
Benim aklıma bir soru getiriyor. "Yorumu bu kural: . cebirsel nedir
(forall r . (a -> r) -> r) ~ a
Her beton türü izomorfizma için eşdeğer cebirsel bir kural işaret gibi:
(a, (b, c)) ~ ((a, b), c)
a * (b * c) = (a * b) * c
a -> (b -> c) ~ (a, b) -> c
(c^b)^a = c^(b * a)
Ama benzer bir cebirsel eşitlik anlamıyorum:
(forall r . (a -> r) -> r) ~ a
CEVAP
Bu Yoneda lemma kimlik için ünlü eşleme.
Daha fazlası için okunabilir giriş ve herhangi bir kategori teorisi bir ders kitabı this posta çeki.
Kısaca, f :: forall r. (a -> r) -> r
verilen f id
** 22, ve tersine, x :: a
verilen almak uygulayabilirsiniz ($x)
forall r. (a -> r) -> r
alabilirsiniz.
Bu işlemleri karşılıklı olarak ters. Kanıt:
Belli ki ($x) id == x
. Bunu göstereceğim
($(f id)) == f
,
fonksiyonlar tüm değişkenler eşit olduğunda eşit olduğu, x :: a -> r
alıp gösteriyor
($(f id)) x == f x
yani
x (f id) == f x
.
f
polimorfik olduğu için, doğal bir dönüşüm olarak; f
doğallık diyagramı çalışır:
f_A
Hom(A, A) → A
(x.) ↓ ↓ x
Hom(A, R) → R
f_R
x . f == f . (x.)
.
Kimlik (x . f) id == f x
takmak. QED
Polimorfizmi ağır basan vs vs Aşırı...
Polimorfizmi c ...
Çeviri belleği kopyalamak için hızlı b...
Otomatik Metin Nasıl devre dışı MSDN s...
Haskell'in cebirsel veri türleri...