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( fmapherhangi bir ifadede bahsettiğimiz şeyi sıralamak Haskell derleyicisine bağlıdır ). Dolayısıyla Listbunun bir işlev olduğunu söyleyemeyiz ; Sadece kombinasyonu Listve fmapbir funktoru olduğunu. Yine de insanlar gösterimi kötüye kullanıyor; programcılar çağrı Listkategori 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 -> Typebir 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 intgelmez oluşturmak tamsayılar listelerinin yeni bir tür. Bu tür zaten vardı . Bizim kategorisinde bir nesne oldu Tip . List Intsadece bunu ifade etmenin bir yoludur.
Şimdi, bir işlevin neden bir türü, diyelim Intveya 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 intdeğ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 = intafmap f = \x -> x