it-swarm.asia

Fonksiyonel Programlamaya Giriş için Şema mı Haskell mi?

C ve C # programlarında rahatım ve gelecekte C++ 'ı keşfedeceğim. İşlevsel programlamayı farklı bir programlama paradigması olarak araştırmakla ilgilenebilirim. Bunu eğlenmek için yapıyorum, işim bilgisayar programlamayı içermiyor ve üniversitede bilgisayar bilimi derslerinde oldukça erken öğretilen fonksiyonel programlamanın kullanımından biraz ilham alıyorum. Lambda hesabı kesinlikle matematiksel yeteneklerimin ötesinde, ama bence işlevsel programlama.

Haskell veya Scheme'den hangisi fonksiyonel programlamaya iyi bir giriş niteliğindedir? Metin düzenleyicim olarak emacs kullanıyorum ve gelecekte Emacs LISP öğrenmeyi gerektiren daha kolay bir şekilde yapılandırmak istiyorum. Bununla birlikte, benim anlayışım Emacs LISP'nin Scheme'den oldukça farklı olduğu ve işlevselliğin aksine daha prosedürel olduğudur.

Şemaya devam edersem muhtemelen satın almış olduğum "Küçük Schemer" kitabını kullanırdım (bana sınırlı yapraktan biraz garip geliyor). Ya da eğer Haskell'i takip edersem "Büyük Fayda için Haskell Öğrenin" i kullanırsınız. Ayrıca Kanal 9'da Dr Erik Meijer'in girişine Haskell videolarını da izleyeceğim.

Herhangi bir öneri, geribildirim veya girdi takdir.

Teşekkürler.

Not; BTW C # geliştirme için kullandığım Visual Studio 2010'a sahip olduğum için F # 'a da erişebiliyorum, ancak bunun bir dil seçmek için ana kriterlerim olması gerektiğini düşünmüyorum.

36
haziz

OCaml tavsiye ederim.

Benim kişisel görüşüme göre, modern işlevsel programlamanın temel temeli, yüksek mertebeden fonksiyonlar, statik tip sistem, cebirsel veri türleri ve örüntü eşleştirmedir.

Bir Şema, ML ve Haskell arasında ML'yi seçerim çünkü bu tanımla en alakalı olduğunu düşünüyorum. Şemada statik yazım yoktur (Yazılan Raket vardır, ancak şema yeni başlayanlar için değildir) ve Haskell, ilginç olsa da dikkati önemli temelden saptırabilecek çok fazla başka şeye (monads, tembel değerlendirme ...) sahiptir. .

SML ve OCaml eşit derecede ilginçtir; Daha çok OCaml'a alışkınım ve daha hoş bir "pratik" hissi var (ama gerçekten ruhunuzu kaybetme riski için "pratik" istiyorsanız, F # da seçebilirsiniz).

Şema ve Haskell de çok ilginç dillerdir. Makrolara yapılan şema vurgusu ilginçtir, ancak doğrudan işlevsel programlama ile ilgili değildir (dünyadaki kesinlikle denemeniz gereken şeylerin yanı sıra mantık programlama, yığın tabanlı diller ve yetenek odaklı E).

Haskell kesinlikle harika bir dildir ve bence işlevsel programlamanın hevesli gurusu için zorunlu bir noktadır. Ancak OCaml ve Haskell'in temel dilleri çok benzer olduğu için (yeni başlayanlar için dikkat dağıtıcı tembel değerlendirme hariç), OCaml'ın temellerini öğrendikten sonra Haskell'i öğrenmek kolaydır. Daha doğrusu, garip şeylere konsantre olabilirsiniz ve aynı zamanda temelleri asimile etmek zorunda değilsiniz.

Benzer şekilde, OCaml ve muhtemelen Haskell'i gördükten ve hala daha fazla bilgi edinmek istiyorsanız, Coq veya Agda'ya bakmalısınız. Yine de çok azı fonksiyonel programlamaya ilk giriş için Coq veya Agda'yı öneriyor ...

Açıklamak gerekirse: Bence OCaml (veya SML) öğrenmenin Haskell sizi Haskell'i doğrudan öğrenmek kadar fonksiyonel bir programcı haline getireceğini, ancak daha kolay (veya daha az acı verici) yapacağını düşünüyorum.
Ayrıca, OCaml ve Haskell'in her ikisinin de onları ayıran iyi şeyleri var ve her ikisinin de gelişmiş özelliklerini bilmek ilginç. Sadece Haskell'i öğrenmek bu açıdan daha zayıftır (tabii ki Haskell'den sonra OCaml öğrenebilirsiniz; bence bu daha az mantıklı ve sizi daha fazla hayal kırıklığına uğratacak).

OCaml öğrenmek için tavsiye ederim Jason Hickey'in kitap taslağı (PDF) .

¹bu tanım tartışmalıdır. Bazı Scheme kullanıcıları statik yazmanın işlevsel programlama ile ilgisi olmadığını iddia edecektir. Bazı Haskell halkı, saflık tanımlarının ("Haskell'in yaptığı, ancak artık yok") işlevsel bir dil olması için olmazsa olmaz bir koşul olduğunu iddia edecektir. . Katılmayı kabul ediyorum.

28
gasche

Fonksiyonel programlamada daha gelişmiş kavramlarla ilgileniyorsanız, Haskell ile gidin. Uygun bir tip sistemi ve mutasyona karşı katı bir yasak var. Yine de, Haskell kalbin zayıflığı için değil.

Sadece fonksiyonel tasarıma giriş yapmak istiyorsanız, Scheme ile devam edin. Sözdiziminin öğrenilmesi ve okunması çok daha kolaydır. Prosedürel programlamaya izin verir, ancak ! adının sonunda.

Şema ile, programlama paradigmalarına en iyi giriş olan Bilgisayar Programlarının Yapısı ve Yorumlanması 'ı da okuyabilirsiniz. Kitapta MIT ve Berkeley dersleri var.

26
Hoa Long Tam

Doğru cevap, elbette, her ikisi de! Bu sadece ilk önce hangi dilin ele alınacağı sorusudur. Benim durumum seninkiyle aynı. Küçük Schemer'den çok keyif aldım. Bunu geçtikten sonra fonksiyonel programlamanın temel yapılarını kesinlikle anlayacaksınız (ve jöle lekelerinizi koymak için bir yere sahip olacaksınız!)

Harika bir iyilik için Haskell Öğrenmek için yaklaşık bir çeyrek var. Ben de bundan biraz keyif alıyorum ama iki kitap daha farklı olamazdı. Sizi Öğrenin Bir Haskell'in belirli bir dili öğretmek için çok geleneksel bir yaklaşımı vardır. Küçük Schemer, açıkça Şema'ya özgüdür, ancak Şema'nın dilini değil, işlevsel programlamanın temellerini öğretmekle çok daha fazla ilgilidir.

Kesinlikle Küçük Schemer ile başlamanızı öneririz. Daha az pratik, ancak daha temel.

17
DaveGauer

Fonksiyonel programlama ile ilgili iki sentim, belirli bir dile asılmamak, ancak fonksiyonel programlamanın temel kavramlarını öğrenmek. Patronumun APL'deki tüm gelişmelerin yapılması konusunda ısrar ettiği bir projeye doğru adım atarak fonksiyonel programlamayı öğrendim. APL işlevsel bir dizi işleme dilidir ve LISP, Haskell veya alabileceğiniz diğer herhangi bir ana programlama dilinden uzaktır. Gerçek getirisi, fonksiyonel programlama paradigmasını "yutturduğum" ve zihinsel olarak bir problemin işlevsel bir programa otomatik olarak nasıl ayrıştırılacağını öğrendiğimde, artık Haskell gibi diğer fonksiyonel dillerin deyimsel yönleriyle korkutmadım, OCaml, Scheme, Scala ve Clojure. O zamandan beri diğer fonksiyonel dillerle hız kazanmada oldukça başarılı oldum ve OCaml, Scala ve SBCL'de oldukça iyi ticari kalite kodu yazdım.

İlk işlevsel dili seçseydim, muhtemelen Haskell veya Steel Bank Common LISP'yi (SBCL) seçerdim. Haskell için Size bir Haskell Öğrenin ..., Gerçek Dünya Haskell, Haskell Mantık, Matematik ve Programlamaya Giden Yol, ve Fonksiyonel Algoritma Tasarımının İncileri. CL için LISP Land, Yapay Zeka Programlama Paradigmaları ve (gerçekten hardcore iseniz) Lambda'yı bir kenara bırakın . Pratik fonksiyonel programlama yaklaşımları ve kavramlarına genel bir bakış için tüm bu kitapları karıştırabilir ve eşleştirebilirsiniz.

Aynı zamanda Clojure ve Scala öğrenmeyi de düşünürüm, çünkü hem kendi başlarına hem de çok iyi ve çok etkileyici fonksiyonel dillerdir (FP purist söyleyebilir).

17
Marc

"İkisini de öğren" noktasına katılıyorum, ancak şu ana kadar bahsedilmeyen birkaç nokta daha var. Her şeyden önce, fonksiyonel programlamaya yeniyseniz ve Haskell ile gidiyorsanız, FP'nin yanı sıra birkaç yeni şeyle yüzleşmeniz gerekir: kayda değer çaba gösterebilecek tembel bir ortamda nasıl yaşayacağınızı öğrenmeniz gerekir ve ihtiyacınız C veya C # 'da kullandığınızdan çok uzakta olabilecek bir "gerçek" tip sistemle başa çıkmak için.

Şema, OTOH, yabancı görünümlü bir sözdizimine sahiptir, ancak öğrenilecek statik bir sistem yoktur ve katı bir dildir, bu yüzden işler daha tanıdıktır. Buna ek olarak, Şema uygulamaları çok biçimlendirilebilir olma eğilimindedir - örneğin, Raket bunu bir uç noktaya götürür ve tembel bir varyant ve statik olarak yazılmış bir sağlar. Bu, "kolay" şeylerle başlayabileceğiniz ve işlevsel bir dil kullanarak asabileceğiniz anlamına gelir ve daha sonra kendinizi büyütebilir ve yazılan varyantı ve tembel olanı kullanabilirsiniz. Her seferinde bir özellikle uğraştığınız için şimdi daha kolay olmalılar. Açık olmak gerekirse, kavramları sözdizimsel sorunun küçük ve çoğunlukla alakasız olacağı kadar yeni olacak. Başka bir deyişle, yeni kavramlara ulaşmaya başladığınızda, sözdiziminin kaybolacağı kadar meşgul olacaksınız. (Ve sözdizimini gerçekten önemsiyorsanız, Haskell'in sözdizimi kişisel olarak çok zarif olduğunu düşündüğüm bir şeydir - ancak bunun nedeni ortalama C/C #/C++ sözdiziminden çok uzak olmasıdır.)

Ama tüm bunları söyledikten sonra, F # için de iyi bir nokta olduğunu düşünüyorum - bunu bir yan şey olarak yaptığınızı söylüyorsunuz, ancak FP F # kullanmak, daha fazla "gerçek" şeyler yapabileceğiniz anlamına gelir, çünkü günlük işlerinizde uğraştığınız aynı sorunların üstesinden gelmek muhtemelen kolaydır. d üzerinde kullanmanın avantajını görelim, diyelim ki, C # - ve bazı projelerde kullanın.Bu yüzden sadece F # 'ı seçmemekte haklı olduğunuz halde, aslında daha kolay bir şey olmadığı için düşünmelisiniz. bu yeni kavramları kullanarak. Buna karşılık, Şema veya Haskell kullanıyorsanız ve bunu amacınız için bir oyuncak dili olarak görürseniz (bazı kişilerin kullandığı bile olsa) gerçek uygulamalar için), o zaman asla FP şeyi çok ciddiye almayacaksınız. [Ama YMMV, çoğunlukla öznel gözlemlere dayanıyor ve bir kişiden diğerine büyük ölçüde değişebilir.]

6
Eli Barzilay

Kendinize 48 saat içinde bir Şema yazın (haskell'de)

Bunu gerçekten tavsiye ederim. Haskell'i gerçek ve ilginç bir problem kullanarak öğreneceksiniz ve inşa ettiğiniz yorumlayıcıyla oynamaktan en iyi program dersini öğreneceksiniz. Bu rotaya giderseniz, etrafta iyi Haskell tanıtımları yapın. Çözülecek bir sorununuz varsa onları daha iyi anlayacaksınız.

6
John F. Miller

ML'nin seçeneklerinizden biri olmamasının bir nedeni var mı? Kitaplar ve ders notları da dahil olmak üzere makul miktarda tanıtım materyali bulunmaktadır. The Little Schemer isterseniz, ayrıca The Little MLer tadını çıkarabilirsiniz. Son olarak, daha sonra F # 'a kolayca geçiş yapabilirsiniz. (Haskell veya Scheme'ı çalıyorum - ideal olarak üçünü de öğreniyorum).

Ayrıca, Emacs LISP hakkında uyarı Sözü. Haskell veya ML'nin seni buna hazırlayacağını sanmıyorum. Şema gibi Lispy dili yardımcı olacaktır, ancak hala büyük farklılıklar vardır, örneğin. dinamik kapsamda değişkenler. Emacs uzantıları, doğası gereği, işlevsel olmaktan daha zorunludur - hepsi editörün durumunu değiştirmekle ilgilidir.

6
petebu

Haskell ile giderdim. Şemada, yordamsal şeyler yapmaya itilebilirsiniz ve türü sistemi, Haskell'in yeni başlayanlar için büyük olduğu gibi, kodunuzun derlemede doğru olduğunu hemen hemen kontrol ettiği için neredeyse yararlı değildir. saati.

4
alternative

Bence diller hakkındaki tartışmalara kapılmak kolay değil. FP hakkında ne olduğunu öğrenmek isteyen biri için, Ocaml/ML/Scheme/Haskell arasındaki farklar malzeme ile rahatlığınızın yarısı kadar önemli değildir (kitaplar, videolar, araçlar) Ve belirli bir dili öğrenmenize yardımcı olacak bir arkadaşınız olup olmadığı her şeyi koyar.

1
autodidakto

Sorunuza gelen cevaplardan birinde bu bağlantı oldukça ilginç buldum, çünkü size Haskell ve Scheme'nin bir tadını veriyor.

Bu şık bağlantıya ek olarak, sorunuzu ele almam.

Zorunlu bir programlama geçmişinden geliyorsanız, fonksiyonel programlamayı öğrenmek için çok çaba sarf edebilirsiniz. Öğrenme deneyiminin boş olmadığından emin olurdum. Bu, mevcut veya sonraki işinize uygulayabileceğiniz veya size başka bir şekilde yardımcı olacağıdır.

Orada birçok iyi dil var. Scala insanlar Clojure ve CL milletlerinde olduğu gibi kendi dillerinden çıkacaklar. Pythonistas bile tembellik iddia ediyor. Size cevap veren diğer insanlar ML önerdi. Amit Rathore Clojure yazan Eylem, Haskell'i öğrenmenizi bile önerebilir.

Windows ve F # 'dan bahsettiniz. Mevcut pozisyonunuzda size yardımcı olacak mı? F # hakkında hiçbir şey bilmiyorum. Yeterince işlevsel mi? Bunu soruyorum, çünkü IMHO Python fonksiyonel yapılara sahip, ancak Clojure'da programlama gibi değil.

Özetlemek gerekirse, "gerçekten" işlevsel olan fonksiyonel bir dil öğrenin ve bunu yapmak durumunuz için en iyi mantıklıdır.

0
octopusgrabbus

Eğer saf değilse, zorunlu bir dil de kullanabilirsiniz, Haskell.

0
pyon