Kategori Teorisi, fonksiyonel programlamayı öğrenmek için faydalı mıdır?


118

Haskell'i öğreniyorum ve dilden etkileniyorum. Ancak ciddi bir matematik veya CS geçmişim yok. Ama ben deneyimli bir yazılım programcısıyım.

Haskell'de daha iyi olabilmek için kategori teorisini öğrenmek istiyorum.

Haskell'i anlamak için kategori teorisinde hangi konuları iyi bir temel oluşturmayı öğrenmeliyim?



1
Programlamayı ve cs'yi ayırdığınız için teşekkür ederim.
jmite

4
"Haskell'de daha iyi hale gelmek için Kategori Teorisi Öğrenme" biraz "teniste daha iyi hale gelmek için fizik öğrenmek" gibi
user26756

Yanıtlar:


115

Bir de Teorik Bilgisayar Bilimi sitedeki önce verilen bir yanıta , ben kategori teorisi tipi teorisi için "vakıf" olduğunu söyledi. Burada daha güçlü bir şey söylemek istiyorum. Kategori teorisi tip teorisidir . Tersine, tip teorisi kategori teorisidir . Bu noktalarda genişleyeyim.

Kategori teorisi tip teorisidir

Yazılan herhangi bir biçimsel dilde ve hatta normal matematikte, enformel notasyon kullanarak, türündeki işlevleri bildiririz . Yazılı olarak ve "type" olarak adlandırılan bazı şeyler olduğu ve bir türden diğerine "işlev" olduğu fikridir . Kategori teorisi, bu tip "ve" fonksiyonların "cebirsel teorisidir. (Resmen, kategori teorisi, gelenekçilerin set-teorik ayak parmaklarına dokunmaktan kaçınmak için onlara “nesneler” ve “morfizmalar” olarak adlandırır, ancak giderek artan bir şekilde bu teoriyi rüzgara çeken ve daha sezgisel terimleri kullanan kategori teorisyenlerini görüyorum: "tür "ve" function ". Ama,A B ff:ABABf

Hepimiz liseden itibaren set teorisi üzerine büyüdük. Bu yüzden, set olarak ve gibi tipleri ve set-teorik haritalamalar gibi gibi fonksiyonları düşünmeye alışkınız. Onları hiç böyle düşünmediyseniz, formdasınız demektir. Set teorik beyin yıkamasından kaçtınız. Kategori teorisi, pek çok türde ve birçok türde fonksiyon olduğunu söylüyor. Dolayısıyla, kümeler olarak türlerin fikri sınırlayıcıdır. Bunun yerine, kategori teorisi türleri ve fonksiyonları cebirsel bir şekilde aksiyomize eder. Temel olarak, kategori teorisi budur. Bir tür ve fonksiyon teorisi. Yüksek düzeyde soyutlama içeren, oldukça karmaşık bir hale geliyor. Ancak, eğer bunu öğrenirseniz, türleri ve fonksiyonları derinlemesine anlayacaksınız.B fABf

Tip teorisi kategori teorisidir

"Tip teorisi" derken, her şeyin tip kontrolünü sağlayan katı terim oluşturma kurallarına dayanan herhangi bir türden yazılı dili kastediyorum. Ne zaman böyle bir dilde çalışıyorsak, kategori teorik bir yapıda çalışıyoruz. Set-teorik notasyonları kullanıp set-teorik olarak düşünmemize rağmen, yine de kategorik olarak anlamlı şeyler yazmaya başlıyoruz. Bu inanılmaz bir gerçek .

Tarihsel olarak, Dana Scott bunu ilk fark eden olabilir. Yazılı (ve yazılmamış) lambda matematiğine dayalı anlamsal programlama dilleri modelleri üzerinde çalışmıştır. Geleneksel küme teorik modeller bu amaç için yetersizdi, çünkü programlama dilleri teoriye sahip olmayan sınırsız özyinelemeyi içeriyordu. Scott, programlama fenomenini yakalayan bir dizi anlamsal model icat etti ve lambda matematiğinin tam olarak kartezyen kapalı kategoriler olarak adlandırılan bir kategoriler sınıfını temsil ettiğini fark etti . "Set-teorik" olmayan pek çok kartez kapalı kategorisi vardır. Ancak yazılan lambda matematiği hepsine eşit olarak uygulanır. Scott, " Lambda matematiğinin kuramlarını ilişkilendirme " adında güzel bir makale yazdı."neler olup bittiğini, bir kısmı web üzerinde mevcut görünüyor." Orijinal HB Curry: Kombinatorik Mantık Üzerine Denemeler ", Lambda Calculus ve Formalism Üzerine Denemeler", Academic Press, 1980. Berry ve " Muhtemelen bağımsız olarak Curien de aynı hayata geçirilmiş, işlevsel fikirlerin uygulanmasında bu fikirleri kullanmak için kategorik bir soyut makine (CAM) tanımlamışlar ve uyguladıkları dilin Microsoft'un F # ' nun temel çerçevesi olan "CAML" olarak adlandırılmıştı .

, , vs. gibi standart tip yapıcılar functorlardır . Bu, yalnızca türleri türlerle eşlemekle kalmaz, aynı zamanda türler arasındaki türden işlevlere işlev görürler. Polimorfik fonksiyonlar , functor eylemlerinden kaynaklanan tüm bu fonksiyonları korur. Kategori teorisi 1950'lerde Eilenberg ve MacLane tarafından icat edildi.L ı s t×Listtam olarak polimorfik fonksiyonlar kavramını biçimlendirmek. Onlara "doğal dönüşümler", "doğal" diyorlar çünkü tür değişkenlerini kullanarak doğru şekilde yazabileceğiniz tek kişiler onlar. Bu yüzden, bir kategori programlama teorisinin, programlama dilleri ortaya çıkmadan önce bile, polimorfik programlama dillerini resmileştirmek için icat edildiğini söyleyebiliriz!

Bir set-teorik gelenekçinin, set-teorik notasyonları kullandığında yüzeyin altında gerçekleşen functorlar ve doğal dönüşümler hakkında bilgisi yoktur. Ancak, tip sistemini sadık bir şekilde kullandığı sürece, gerçekten farkında olmadan kategorik yapılar yapıyor.


Tüm söylenen ve yapılanlar, kategori teorisi, türlerin ve fonksiyonların en temel matematik teorisidir. Bu nedenle, tüm programcılar, özellikle işlevsel programcılar olmak üzere, biraz kategori teorisi öğrenmekten faydalanabilirler. Ne yazık ki, özellikle programcıları hedef alan kategori teorisi hakkında herhangi bir ders kitabı görünmemektedir. "Bilgisayar bilimi için kategori teorisi" kitapları tipik olarak teorik bilgisayar bilimi öğrencileri / araştırmacılarına yöneliktir. Bilgisayar bilimcileri için temel kategori teorisi olan Benjamin Pierce'in kitabı belki de en okunaklı olanıdır.

Ancak, web üzerinde programcıları hedef alan birçok kaynak var. Haskellwiki sayfa iyi bir başlangıç noktası olabilir. At Midlands Graduate School , biz (diğerleri arasında) kategorisinde teorisi üzerine dersler var. Graham Hutton'un kursu "acemi" kursu, benimki de "ileri" kursu. Ancak her ikisi de temelde aynı içeriği kaplar, farklı derinliklere gider. Chalmers Üniversitesi dünyanın dört bir yanından gelen kitaplar ve ders notları hakkında güzel bir kaynak sayfasına sahiptir . "Sigfpe" nin coşkulu blog sitesi, programcının bakış açısından pek çok iyi sezgi de sunuyor.

Öğrenmek isteyeceğiniz temel konular:

  • kategori tanımı ve bazı kategori örnekleri
  • fonktorlar ve bunlardan örnekler
  • doğal dönüşümler ve bunlardan örnekler
  • ürünlerin, kopyaların ve üstlerin tanımları (fonksiyon alanları), ilk ve son nesneler.
  • adjunctions
  • monad, cebir ve Kleisli kategorileri

Kendi ders notları içinde Midlands Graduate School sonuncusu (monads) dışındaki tüm bu konuları kapsar. Bugünlerde monadlar için uygun başka kaynaklar var. Yani bu büyük bir kayıp değil.

Ne kadar çok matematik bilirseniz, kategori teorisini öğrenmek o kadar kolay olur. Kategori teorisi genel bir matematiksel yapı teorisi olduğu için, tanımların ne anlama geldiğini anlamak için bazı örnekler bilmek faydalı olacaktır. (Kategori teorisini öğrendiğimde, programlama dili anlambilimi konusundaki bilgilerimi kullanarak kendi örneklerimi oluşturmam gerekti, çünkü standart ders kitaplarında sadece hiçbir şey bilmediğim matematiksel örnekler vardı.) Sonra Lambek'in mükemmel kitabı geldi. ve Scott " Kategorik mantığa giriş ""hangi kategorilerle ilgili hangi tip teoriyi yazıyorlar (" mantık "olarak adlandırıyorlar). Artık kategori teorisini, birçok örnek bile bilmeden, sadece tip sistemleriyle ilişkilendirerek anlamak mümkün. Yukarıda bahsettiğim kaynakların çoğu bunu kullanıyor. kategori teorisini açıklamak için yaklaşım.


3
@UdayReddy Kategori teorisi ile tip teorisi tanımlamanıza kesinlikle katılmıyorum. Modern tip teorisi, eşzamanlılık süreçleri için olan tiplerle ilgilidir, örneğin oturum tiplerinin teorisi geleneğidir. Bildiğim kadarıyla, bu tip yazım sistemlerinin kategorik bir anlayışı yoktur.
Martin Berger

6
@MartinBerger "Tip teorisi" hakkındaki yorumunuzun biraz dar olduğunu düşünüyorum. Bununla birlikte, oturum tiplerinin uygun bir tip teorik ve kategori teorik anlayışının şu anda zaman harcamayı düşündüğüm iyi bir araştırma zorluğu olduğu konusunda hemfikirim.
Uday Reddy,

2
@MartinBerger. Kategori teorisinin daha zengin hesaplama kavramlarına nasıl uygulandığını görmek için, sizi zorunlu programlama teorisine ve oyunların anlambilimine (yine de zorunlu hesaplamaları oldukça iyi kodlayabilen) teoriye nasıl uygulandığını görmeye davet ediyorum. Dolayısıyla, işlevsel programlamanın kategori teorisi üzerinde tekele sahip olduğuna inanmıyorum.
Uday Reddy,

1
@nicolas, fibrasyonlar, bağımlı tipleri modelleyen indekslenmiş kategorileri yapmak için bir yoldur. Eşfaybreyşınlar aynı zamanda program mantığı çok genel bir biçimde, olarak görülebilir anlamına harita için -satisfying değerleri -satisfying değerleri. f P Qf:PQfPQ
Uday Reddy

2
“Maalesef, özellikle programcıları hedef alan kategori teorisi üzerine herhangi bir ders kitabı yok gibi görünüyor.” Bartosz Milewski'nin Programcılar İçin Kategori Teorisi'nde böyle bir "ders kitabı" az ya da çok var . Bartosz ayrıca eşlik eden bir konferans serisi yarattı .
alx9r,

30

Kısa ve tatlı tutmaya çalışacağım. Haskell programları ile bazı çalışmalarla daha resmi hale getirilebilecek belirli sınıf sınıfları arasında resmi olmayan bir yazışma vardır. Bu yazışma Curry-Howard-Lambek yazışmaları olarak bilinir ve aşağıdakilerle ilgilidir:

  1. Kategorinin nesneleri ile Haskell türleri
  2. Şartlar tipi ile morfizimler (benzer gösterimler dikkat edin)f : A BAB f:AB
  3. Cebirsel veri türleri ile ilk nesne
  4. Tip kurucular ile functors
  5. vb

Liste uzayıp gider, ancak önemli bir nokta, kategori teorisinde monad ve cebir gibi şeyleri tanımlayabilmeniz ve hem matematikçiler için faydalı hem de Haskell programlama uygulamasında yaygın olan kavramlar ortaya çıkarabilmenizdir .

Hangi kitabı önereceğimi bilemiyorum, çünkü bilgisayar bilimcileri için kategorilerle ilgili tamamen tatmin edici bir tanıtım kitabı bulamadım. Kategoriler, Tipler ve Yapıları Asperti ve Longo ile deneyebilirsiniz . Fikir, ayarlara kadar temel tanımları öğrenmek ve daha sonra bu kavramları denemek ve anlamak için mükemmel bloglardan bazılarını okumaya çalışın.


1
"Her ikisi de matematikçiler için yararlı olan, ancak Haskell programlama uygulamasında yaygın olan kavramlar ortaya çıkar" - bir örnek verebilir misiniz ya da çok fazla önceden bilgi gerektirecek mi?
Raphael

7
@Raphael: Monads. Oklar. Cebir. Coalgebras.
Dave Clarke

6
Functors, dualite, Kleisli kategorisi, Yoneda lemması ...
cody

4
Cartesion kapalı kategoriler. Currying.
Dave Clarke

2
"Yazılım Mühendisleri için Kategori Teorisine Giriş", cs.toronto.edu/~sme/presentations/cat101.pdf
Vladimir Alexiev

29

@AJed'in tavsiyesini yinelemek, ifadenizi çevirmenizi tavsiye ederim

I want to learn category theory so I can become better at Haskell.

Kafasında: Haskell'i öğrenin, programlama sezginizi geliştirin. Bir FP gurusu olduğunuzda, kategori teorisini yakalamak daha kolay olabilir (eğer hala umursuyorsanız).

Kategori teorisi geniş matematik eğitimine sahip (basit, gruplar, halkalar, vektör uzayları, topoloji vb.) Birileri için basittir. Bu arka plandan yoksun olarak, kategori teorisi neredeyse aşılamaz. Kategori teorisinin güzelliği, pek çok görünüşte alakasız şeyleri bir araya getirmesidir (örneğin, unutkan functorlerin sol ekleri, serbest gruplar, evrensel saran cebirler, Stone-Cech kompaktlaşmaları, grupların abelizasyonları ...) ve böylece karmaşıklığı azaltır. Ancak, kategori teorisinin birleştirdiği birçok örneğe aşina değilseniz, kategori teorisi hayatınızı zorlaştıran ek bir karmaşıklık katmanıdır.

Tecrübelerime göre, birinin zaten bildiği şeyleri inşa etmek öğrenmesi daha kolaydır. Bir yazılım geliştiricisi olarak, programlama hakkında çok şey biliyorsunuz ve Haskell programlama diğer programlardan farklı değildir, bu yüzden benim önerim Haskell'e pragmatik bir programlama bakış açısıyla yaklaşmak ve kategori teorisini görmezden gelmektir. Haskell'deki kategori teorisi, örneğin bazı monad'lar için destek, bir programcının kategori teorisi ile yoldan ayrılmadan yakalaması çok daha kolaydır. Ne de olsa, monadlar yalnızca genelleştirilmiş bir yapıya sahipler (ve programlama uygulamanızda zaten monad'ları kullanmış olacaksınız - siz bilmeden de olsa) ve Haskell monadik yasaları zorlamadığı için gerçekte monad'ları desteklemiyor.


7
Hayır, gerçekten dürüst Haskell olmak olduğunu geçmiş önyargılı kavramları alma genellikle büyük zorluk olduğunu noktaya, diğer programlama dilleri pek de farklı. Deneyimli yazılım geliştiriciler, daha önce hiç program yapmayan insanlardan daha fazla sorun yaşıyor gibi görünüyor.
CA McCann

5
@CAMcCann Bazı deneyimli programların, örneğin Java veya C # 'dan Haskell'e geçmekte zorlanacağı konusunda hemfikiriz , ancak bunun Haskell ile ilgili temelde farklı bir şey olduğu için sanmıyorum. Bence kısmen çünkü farklı görünüyor . Haskell'i takdir etmek için kategori teorisini öğrenmeniz gerektiği düşüncesi, muhtemelen birkaç deneyimli yazılım geliştiricinin Haskell uzmanlığına ulaşmasını engellemiştir. (Bkz. F # neden monadlara sahip değildir.) Diğer dillerde de benzerliği olmayan birçok Haskell özelliğini düşünmeyi kesinlikle zor buluyorum.
Martin Berger

5
Kategori Teorisini bilmek biraz yardımcı olabilir, ama hepsi bu kadar değil ve bunu öğrenmek Haskell'i öğrenmekten çok daha zor. Çoğu dilin (saflık, kesin olmayan değerlendirme, tip sistemi) karşılaştırıldığında oldukça temel farklılıklar vardır ve tüm BT terimlerinin kaldırılması bunları daha fazla tanıdık hale getirmez. Öte yandan, Haskell öğrenmek, bazı insanları BT öğrenmeye teşvik eder, çünkü ödünç alınan fikirler faydalıdır . F # 'nin sınırlı tip sistemi ve mükemmel derecede iyi bir mevcut terimden kaçınmak, özellikler değil kusurlardır.
CA McCann

1
Scala'dan başka hiçbir dili bilmiyorum, Haskell ile gerçekten karşılaştırılabilir bir tür sistemi var. Ampirik gözlem itibaren saflık olduğunu değil hemen kavradı ve olmayan sıkı değerlendirme (Atlanan olan) daha da zordur. Son olarak, ben bir çalışma programcı ve bunu itiraz herkes alanında bir gözdağı olacak isim . Yazılım geliştirme endüstrisi zaten opak jargonla doludur. Ayrıca, F # 'nın tipi sistemi direkleri doğrudan ifade edemez - hesaplama ifadeleri, kullanımlarını önemli ölçüde sınırlayan birinci sınıf değildir.
CA McCann

2
CBN ayrıca, örneğin çoğu çalışan programcının daha önce kullanacağı bir kavram olan thunking ile analoji yoluyla kavramsal olarak kolaydır. Saflık, her çalışan programcının anladığı bir şeydir. Haskell, İngiltere'de lisans eğitiminde kullanılır. Öğrencilerim bana işlevsel programlamaya nasıl gireceklerini sorduğunda, öncelikle Haskell'i öğrenmeyi öneriyorum, ancak öğrenciler sorunun kaynağı olarak itibarı ile korkuyorlar. Bunun temel nedeninin Haskell'in kategori teorisi ile ilişkisi olduğuna inanıyorum.
Martin Berger

13

Kısa cevap: hayır [ama bu sadece bir fikir]

Haskell'de iyi olmak için Kategori Teorisine veya başka bir teorik alana gitmeyin. Kuyruk özyineleme, harita, azaltma ve diğerleri gibi fonksiyonel programlama tekniklerini öğrenin. Mümkün olduğu kadar kod okuyun. Mümkün olduğu kadar çok fikir uygulayın. Sorun yaşarsanız okuyun ve okuyun.

Haskell ve diğer fonksiyonel programlama paradigmalarını öğrenmek için iyi bir teorik referans istiyorsanız, o zaman şöyle bir göz atın: Lambda Calculus İle Fonksiyonel Programlamaya Giriş, Greg Michaelson (çevrimiçi olarak mevcuttur). ... Başka benzer kitaplar da var.


1
Ben kaşımı kaldırdım, çünkü "kuyruk özyineleme" Haskell'de tembellik nedeniyle programlama için genellikle önemli değil. Bununla birlikte, "yaparak öğren" hemen hemen her zaman iyi bir tavsiyedir.
Dan Burton,

@DanBurton .. ilginç gözlem. Diyelim ki, Haskell yerine, erlang veya şema öğren :). [Haskell konusunda uzman değilim, sadece havalı geldiği için seçtim]
AJed


0

Kategori teorisi çok karmaşık bir matematik dalıdır ve mastering, önceki öğrenmelerinizin çoğunu aynı soyut nesnelerin örnekleri yaparak birleştirecektir. Bu yüzden çok kullanışlı ve sezgisel. Fakat çok geniş ve geniştir ve kendinizi hangisinin ihtiyaçlarınız için uygun olduğunu ve hangisini atlamanız gerektiğini bile bilmeyecek birçok yeni kavramda bulacaksınız. Bu yüzden, amaçlı yaklaşımınız kavramlar arasında bir seçim yapmayı gerektirir, aksi halde bunun üstesinden gelmek kaçınılmaz olarak uzun zaman gerektirir ve gerçekten bir çalışma alanı değildir.

Bu arada, amacın burada olmak için çok iyi bir başlangıç ​​noktası öneriyorum .


Bu soruya gerçekten cevap vermiyor: fonksiyonel programlama öğrenmek için faydalı mı? Kategori teorisindeki hangi konular Haskell için faydalıdır?
David Richerby
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.