Hiç bir kısıtlama yok! Tip yapıcılar için kategori-teorik temeli öğrenmeye başladığımda, bu nokta beni de karıştırdı. Buna ulaşacağız. Ama önce biraz karışıklık çıkarmama izin verin. Bu iki alıntı:
böyle bir işlev yalnızca hedef kategori olarak bir tür oluşturucu kullanılarak oluşturulmuş bir kategoriye sahip olabilir
ve
herhangi bir kategoriye sahip functorları bir functor hedefi olarak düşünebilir, örneğin tüm Haskell tiplerinin kategorisi
bir işlevin ne olduğunu yanlış anladığınızı gösterin (veya en azından terminolojiyi kötüye kullandığınızı).
Functors yok inşa kategoriler. Bir işlev, kategoriler arasındaki bir eşlemedir . Functors, kaynak kategorisindeki nesneleri ve morfizmleri (türleri ve işlevleri) hedef kategorideki nesneye ve morfizmlere getirir.
Not Bu bir funktor gerçekten olduğu anlamına gelir çifti bir nesne üzerinde haritalama: eşleme F_obj morfizimler ve haritalama F_morph . Haskell'de, işlevcinin nesne kısmı F_obj , tür yapıcısının adıdır (örneğin List
), morfizm kısmı işlevdir fmap
( fmap
herhangi bir ifadede bahsettiğimiz şeyi sıralamak Haskell derleyicisine bağlıdır ). Dolayısıyla List
bunun bir işlev olduğunu söyleyemeyiz ; Sadece kombinasyonu List
ve fmap
bir funktoru olduğunu. Yine de insanlar gösterimi kötüye kullanıyor; programcılar çağrı List
kategori teorisyenleri funktor her iki kesiminde başvurmak için aynı sembol kullanırken, bir functor.
Ayrıca, programlamada hemen hemen tüm işlevler endofunktörlerdir , yani kaynak ve hedef kategori aynıdır - dilimizdeki tüm türlerin kategorisi. Bu kategoriye Tür diyelim . Tip üzerindeki bir endofunctor F , T tipini başka bir FT tipine ve T -> S fonksiyonunu başka bir FT -> FS fonksiyonuna eşler . Bu haritalama elbette fonktor yasalarına uymak zorundadır.
List
Örnek olarak kullanarak : birlikte List : Type -> Type
bir işlev fmap: (a -> b) -> (List a -> List b)
oluşturan bir tür yapıcı ve bir fonksiyonumuz var . T
Temizlenecek son bir nokta var. Yazma List int
gelmez oluşturmak tamsayılar listelerinin yeni bir tür. Bu tür zaten vardı . Bizim kategorisinde bir nesne oldu Tip . List Int
sadece bunu ifade etmenin bir yoludur.
Şimdi, bir işlevin neden bir türü, diyelim Int
veya ile eşleyemediğini merak ediyorsunuz String
. Ama olabilir! Kişi sadece kimlik işlevini kullanmak zorundadır. Herhangi bir C kategorisi için , kimlik işlevi her nesneyi kendisine ve biçimselliği kendine eşler. Bu eşlemenin işlev yasalarını karşıladığını doğrulamak kolaydır. Haskell'de bu, id : * -> *
her türü kendi kendine eşleyen bir tür oluşturucu olacaktır . Örneğin, olarak id int
değerlendirir int
.
Dahası, tüm tipleri tek bir tiple eşleştiren sabit functorlar bile oluşturulabilir . Örneğin, tüm türlerin ToInt : * -> *
bulunduğu ve tüm morfizmleri tamsayı kimlik işleviyle eşleyen işlev: ToInt a = int
a
fmap f = \x -> x