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


36

C ve C # ile programlama konusunda rahatım ve gelecekte C ++ 'ı keşfedeceğim. İşlevsel programlamayı farklı bir programlama paradigması olarak keşfetmekle ilgilenebilirim. Bunu eğlenmek için yapıyorum, işim bilgisayar programlaması içermiyor ve bir miktar kolejde bilgisayar bilimi derslerinde oldukça erken öğretilen fonksiyonel programlama kullanımından ilham alıyor. Lambda matematiği kesinlikle matematiksel yeteneklerimin ötesinde, fakat işlevsel programlamayı başarabileceğimi düşünüyorum.

Haskell veya Scheme'den hangisi işlevsel programlamaya iyi bir giriş yapacaktır? Emacs'ı metin editörüm olarak kullanıyorum ve gelecekte Emacs Lisp'i öğrenmeyi gerektirecek şekilde daha kolay bir şekilde yapılandırabilmek istiyorum. Ancak benim anladığım kadarıyla, Emacs Lisp'in Scheme'den oldukça farklı olduğu ve aynı zamanda işlevselliğin aksine daha usule dayalı olduğu yönünde.

Büyük olasılıkla, daha önce aldığım "Küçük Schemer" kitabını kullanıyor olacaktım, eğer Scheme'i takip edersem (bana sınırlı bir şekilde bırakmamdan biraz garip görünüyor). Ya da Haskell'i takip edersem "Büyük İyilik İçin Haskell Öğrenin" i kullanın. Ayrıca Kanal 9'daki Dr Erik Meijer'in Intro to Haskell videolarını izlerdim.

Herhangi bir öneri, geribildirim veya giriş takdir.

Teşekkürler.

PS BTW Ayrıca C # geliştirme için kullandığım Visual Studio 2010'a sahip olduğum için F # erişimine de sahibim, ancak bunun dil seçimi için temel kriterlerim olduğunu düşünmüyorum.


3
UnutmaReal World Haskell
alternatif

14
Küçük yan yorum: lambda matematiği olağanüstü basit bir sistemdir; Bu konuda serin olan şey karmaşık değil, tam tersi; İstediğiniz her şeyi bu kadar basit bir sistemde ifade edebilirsiniz. Bir programlama diliyle başlayın; Şimdi değişken referanslar, fonksiyon tanımları ve fonksiyon çağrıları dışında HER ŞEYİ atın . İşte bu kadar! Lambda hesabı.


9
Beş dakika içinde sana lambda matematiğini öğretebilirim. Şimdi, az önce öğrendiklerinin sonuçlarını anlamak bir ömür sürer. :)

5
Haskell'i Scheme üzerinden seçtim, çünkü çok fazla parantez içermiyordu!
Joey Adams

Yanıtlar:


27

OCaml tavsiye ederim.

Benim kişisel görüşüme göre, modern¹ işlevsel programlamanın temel temeli, üst düzey fonksiyonlar, statik tip bir sistem ve cebirsel veri türleri ve kalıp eşleştirmedir.

Bir Şema, bir ML ve bir Haskell arasında, ML'yi seçerdim, çünkü bu tanımla en alakalı olduğunu düşünüyorum. Düzen statik yazıma sahip değil (Typed Racket var, ancak yeni başlayanlar için değil) ve Haskell'in ilgi çekici olsa da dikkatini önemli bir temelden saptabilecek çok fazla başka şeyi (monad, tembel değerlendirme ...) var. .

SML ve OCaml eşit derecede ilginçtir; OCaml'a daha çok alışkınım ve hoş bir "pratik" hissi var (ama gerçekten "pratik" ten ruhunu kaybetme riskini istiyorsan, F # 'yı seçebilirsin).

Şema ve Haskell de çok ilginç dillerdir. Makrolar üzerindeki şema vurguları ilginçtir, ancak işlevsel programlama ile doğrudan ilişkili değildir (dünyada kesinlikle denemeniz gereken şeylerin yanı sıra mantıksal programlama, yığın tabanlı diller ve yetenek odaklı E).

Haskell kesinlikle harika bir dil ve bence, işlevsel programlamanın gelişmekte olan gurusu için zorunlu bir nokta . Ancak OCaml ve Haskell'in ana 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 tuhaf şeylere konsantre olabilirsiniz ve aynı zamanda temelleri özümsemek zorunda değilsiniz.

Benzer şekilde OCaml ve muhtemelen Haskell'i gördükten ve hala daha fazla bilgi edinmek istediğinizde Coq veya Agda'ya bakmalısınız. Ancak çok azı işlevsel programlamaya ilk giriş için Coq veya Agda'yı önerebilir ...

Amacımı açıklığa kavuşturmak için: Bence OCaml (veya SML) öğrendikten sonra Haskell sizi doğrudan Haskell öğrenmek kadar işlevsel bir programcı, ancak daha kolay (veya daha az acı verici) yapacaktır.
Ayrıca, OCaml ve Haskell ikisini de ayırt iyi şeyler var ve bu gelişmiş özellikleri hakkında bilmek ilginç hem . Sadece Haskell öğrenmek bu yönüyle daha kötüdür (elbette Haskell'den sonra OCaml'ı öğrenebilseniz de daha az mantıklı ve sizi daha fazla sinirlendirecek).

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

¹ Bu tanım tartışmalıdır. Bazı Şema millet, statik yazmanın işlevsel programlama ile ilgisi olmadığını iddia edecektir. Bazı Haskell insanları, saflık tanımlarının ("Haskell ne yapar ama daha fazla değil") işlevsel bir dil olmanın olmazsa olmaz olduğunu iddia eder. Katılmıyorum kabul ediyorum.


3
Beni OCaml'a dürttüğün için teşekkürler, ve evet ruhumu riske atacağım ve F # 'yı keşfedeceğim. Linux, Mac OS X ve Windows (çoğunlukla eski) için geliştiririm, ancak FSI zaten yaptığım üç platformun hepsinde (Linux ve Mac OS X'te mono çalışan) kullanılabilir. Microsoft’un tüm ağırlığının işlevsel bir programlama dilinin arkasında olduğu (“saf olmayan” olsa da) işlevsel programlama hayranları tarafından kararlaştırılmak yerine memnuniyetle karşılanmalıdır.
haziz

SML öldü, ocaml coq yazmak için var
permeakra 21:12

1
ML için + 1; Haskell'den daha açıktır.
m3th0dman

Ayrıca SML veya OCaml, ardından Haskell (+1) öğrenmek de iyi bir fikir. Bu dilleri öğrendikten sonra, başka bir tane (örneğin Scala) seçmek çok kolaydır. Ek olarak, dinamik dilleri hissetmek için Scheme, Common Lisp ve Clojure (bu sırada) bakılabilir.
Giorgio,

@ haziz: İyi yazılımlar oluştursalar bile, Microsoft (veya bu konuda Oracle, vb.), müşteri kilitlenmesi, uyumsuz biçimler, uyumsuz uygulamalar vb. gibi tüm kötü uygulamalar içeren tekelci olmaya devam ediyor
Giorgio

26

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

Sadece işlevsel tasarıma giriş yapmak istiyorsanız, Şema ile devam edin. Sözdizimi öğrenmek ve okumak çok daha kolaydır. Prosedürel programlamaya izin verir, ancak sadece !isminin sonunda herhangi bir prosedür kullanmamak için kendinizi disipline edin.

Scheme ile ayrıca programlama paradigmalarına en iyi giriş olan Bilgisayar Programlarının Yapısını ve Yorumunu okuyabilirsiniz . Hem kitap üzerinde dersler vardır MIT ve Berkeley .


4
"Sözdizimi öğrenmek ve okumak çok daha kolay" çok özneldir.

6
@luqui: Doğru. Belki de 'normal' daha iyi bir kelimedir. Geri tepmeler, ekler, öncelik veya ilişkilendirme sorunları yok - sadece parantez, çok sayıda sonsuz, aptal parantez.
Hoa Long Tam

17

Doğru cevap, elbette, ikisi de! Bu yüzden ilk önce hangi dilin üstesinden geleceği sorusudur. Durumum seninkilerle aynı. Gerçekten Küçük Schemer'ı gerçekten çok sevdim. Bundan sonra fonksiyonel programlamadaki temel yapıları kesinlikle anlayacaksınız (ve jöle lekelerinizi koyacak yeriniz var!)

Büyük iyilik için, seni bir Haskell öğrenmeye çeyreklik yapacağım. Ben de bundan biraz zevk alıyorum, ancak iki kitap daha farklı olamazdı. Sizi Öğrenin Haskell, belirli bir dili öğretmek için çok geleneksel bir yaklaşıma sahiptir. Little Schemer, açıkça Scheme'ye özgüdür, ancak Scheme'nin dilini değil, fonksiyonel programlamanın temellerini öğretmekle çok daha fazla ilgilidir.

The Little Schemer ile başlamanızı kesinlikle tavsiye ederim. Daha az pratik ama daha temel.


17

İşlevsel programlama ile ilgili iki sentim, belirli bir dilde takılmak değil, işlevsel programlamanın temel kavramlarını öğrenmektir. Patronumun APL'de tüm gelişmelerin yapılmasında ısrar ettiği bir projeye baştan başlayarak fonksiyonel programlamayı öğrendim. APL, işlevsel bir dizi işleme dilidir ve LISP, Haskell veya bulabileceğiniz diğer tüm ana programlama dillerinden çok uzaktır. Asıl kazanç, işlevsel programlama paradigmasını "gizlice bağladığım" ve bir sorunu otomatik olarak işlevsel bir programa nasıl otomatik olarak ayıracağımı zihinsel olarak öğrendiğimde, Haskell gibi diğer işlevsel dillerin deyimsel yönleriyle gerçekten korkutmadım. OCaml, Şema, Scala ve Clojure. BEN'

İlk fonksiyonel dili seçseydim, muhtemelen Haskell ya da Steel Bank Common Lisp (SBCL) 'i seçerdim. Haskell için, Bir Haskell Öğrenin ... , Gerçek Dünya Haskell , Mantığa Haskell Yolu, Matematik ve Programlama ve İşlevsel Algoritma Tasarımının İncileri'ni okudum . CL için, ben okurdum Lisp Land , Yapay Zeka Paradigmalar Programlama ve (gerçekten sert değilseniz) Lambda'ya üzerinde edelim . Pratik fonksiyonel programlama yaklaşımları ve konseptlerine genel bir bakış için tüm kitapları karıştırıp eşleştirebilirsiniz.

Clojure ve Scala'yı da öğrenmeyi düşünürdüm, çünkü kendi başlarına hem çok iyi hem de çok etkileyici fonksiyonel diller (FP uzmanının söyleyebildiğine rağmen).


6

"Her ikisini de öğren" konusuna katılıyorum, ancak şu ana kadar belirtilmeyen birkaç nokta daha var. Her şeyden önce, eğer işlevsel programlamaya yeni başlıyorsanız ve Haskell ile gidecekseniz, FP dışında birkaç yeni şeyle yüzleşmeniz gerekir: tembel bir ortamda nasıl yaşayacağınızı öğrenmeniz ve önemli bir çaba göstermeniz gerekir; C veya C # 'da kullandıklarınızdan çok uzakta olabilen "gerçek" tipte bir sistemle başa çıkmak için.

Şema, OTOH, dış görünüşlü bir sözdizimine sahiptir, ancak öğrenilecek statik tip bir sistem yoktur ve bu çok sıkı bir dildir, bu yüzden işler daha aşina olur. Ek olarak, Şema uygulamaları çok kolay işlenebilir olma eğilimindedir - örneğin, Racket bunu aşırıya çıkarır ve tembel bir değişken ve statik olarak yazılmış bir seçenek sunar. Bu, "kolay" şeylerle başlayabileceğiniz ve işlevsel bir dil kullanmaktan vazgeçebileceğiniz anlamına gelir ve daha sonra kendinizi geliştirebilir ve yazılan değişkeni ve tembel dili kullanabilirsiniz. Bir seferde bir özellik ile başa çıkabildiğiniz için artık daha kolay olmalılar. Açık olmak gerekirse, kavramlarsözdizimsel sorunun ufak ve çoğunlukla alakasız olacağı kadar yeni olacaklar. Başka bir deyişle, yeni kavramlara girmeye başladığınızda, söz diziminin kaybolacağı kadar meşgul olacaksınız. (Eğer sözdizimini gerçekten önemsiyorsanız, Haskell'in sözdizimi şahsen çok zarif olduğunu düşündüğüm bir şey - ancak bunun nedeni ortalama C / C # / C ++ sözdiziminizden de çok uzak olmasıdır.)

Ama hepsini söyledikten sonra, F # için iyi bir nokta olduğunu düşünüyorum - bunu bir yan şey olarak yaptığınızı söylüyorsunuz, ancak FP öğrendiğinizde yakında tüm bu iyi şeyleri kullanmak isteyeceksiniz. F # kullanımı, daha fazla "gerçek" şeyler yapabileceğiniz anlamına gelir; çünkü günlük işinizde ele aldığınız sorunların üstesinden gelmek muhtemelen kolaydır. İdeal olarak, C # -, üzerinde kullanmanın ve bazı projelerde kullanmanın avantajını göreceğiniz bir noktaya gelirsiniz. Bu yüzden F # seçmemekte haklısın, çünkü erişimin kolay olduğu için, onu kullanmaktan daha iyi bir şey olmadığı için düşünmelisin.bu yeni kavramlar. Buna karşılık, Scheme veya Haskell kullanıyorsanız ve bunu amacınıza uygun bir oyuncak dili olarak görüyorsanız (bazılarının gerçek uygulamalar için kullandığını bilseniz bile), o zaman tüm FP olayını asla ciddiye almazsınız. [Ama YMMV, çoğunlukla öznel gözlemlere dayanıyor ve bir kişiden diğerine büyük ölçüde değişebiliyor.]


6

ML'nin seçeneklerinden biri olmamasının bir nedeni var mı? Kitaplar ve ders notları da dahil olmak üzere makul miktarda tanıtım materyali vardır. Eğer Little Schemer’ı seviyorsanız, The Little MLer’ın tadını da çıkarabilirsiniz. Son olarak, daha sonra F # 'ya kolayca geçiş yapabilirsiniz. (Haskell veya Scheme'i vurduğumdan değil - ideal olarak üçünü de öğrenin).

Ayrıca, Emacs Lisp hakkında bir uyarı. Haskell veya ML'nin seni buna hazırlayacağını sanmıyorum. Şema gibi bir Lispy dili yardımcı olacaktır, ancak hala büyük farklılıklar vardır. dinamik olarak kapsamlandırılmış değişkenler. Emacs uzantıları, doğası gereği, işlevsellikten daha zorunluluk olma eğilimindedir - hepsi editörün durumunu değiştirmekle ilgilidir.


Beni ML / OCaml'e dürttüğün için teşekkürler, ve evet "ruhumu tehlikeye atacağım" ve F # 'yu keşfedeceğim. Linux, Mac OS X ve Windows (çoğunlukla eski) için geliştiririm, ancak FSI zaten yaptığım üç platformun hepsinde (Linux ve Mac OS X'te mono çalışan) kullanılabilir. Microsoft’un tüm ağırlığının işlevsel bir programlama dilinin arkasında olduğu (“saf olmayan” olsa da) işlevsel programlama hayranları tarafından kararlaştırılmak yerine memnuniyetle karşılanmalıdır.
haziz

BTW Amazon'dan The Little MLer'a sipariş verdim ve zaten aldım ve Yolculuğumda başladım. Ayrıca kütüphaneme F # Learning ekledim. The Little MLer'ı desteklemek için kullanacağım daha yaygın bir öğretim rehberi gibi görünüyor.
haziz

6

Kendine 48 saat içinde bir Şema yaz (haskell)

Bunu gerçekten tavsiye ederim. Haskell'i gerçek ve ilginç bir problem kullanarak öğreneceksiniz ve oluşturduğunuz tercümanla oynamaktan en iyi program dersini öğreneceksiniz. Bu rotaya giderseniz, birkaç iyi Haskell tanıtımına devam edin. Çözmeniz gereken bir sorun varsa, onları daha iyi anlayacaksınız.


Aslında bu wiki / pdf'i Haskell'i öğrenmek ve OCaml becerilerimi geliştirmek için kullandım (deyimsel Haskell'i OCaml'a çevirerek). Birisi bu materyali alıp birkaç fonksiyonel dil için “çatal ”layabilseydi çok iyi olurdu. Oldukça havalı bir fonksiyonel dil atışları için temel olabilir!
Marc

1
Bununla ilgili asıl sorun, monadları tanıtmadan parsec'i tanıtmasıdır.
alternatif

@alternative parsec'in Monadic arayüzü var, ancak aynı zamanda birçok başka fonksiyondan bahsetmek yerine, Uygulamalı bir arayüzü var. Monadik genelleştirmeden önce Parsec'i tanıtmak mantıksız değil
Philip JF

4

Haskell ile giderdim. Programda, usule ilişkin şeyler yapmaya zorlanabilir ve tip sistemi neredeyse Haskell'in sahip olduğu kadar faydalı değildir; bu, yeni başlayanlar için harikadır ve derleme zamanında kodunuzun doğru olduğunu kontrol eder.


3
"hemen hemen kodunuzun doğru olduğunu kontrol eder" çok yanlış. Hiçbir tip sistem bunu yapamaz. (Tip sisteminiz gerçek bir teorem atasözü değilse.)
Eli Barzilay

4
@Eli, Haskell kullandın mı? Teorik olarak bu ifade açıkça yanlıştır, ancak uygulamada, en azından kullandığım diğer dillerle kıyaslandığında oldukça doğru buluyorum. Bununla birlikte, bunun yeni başlayanlar için iyi bir özellik olduğunu kabul etmiyorum. İpleri öğrenirken, derleyicinin bana yanlış olduğunu ve hata mesajlarının kullandığı kelimeleri bile bilmediğimde onunla savaşmak zorunda kalmayacağını söylemek yerine kodumun yanlış yaptığını görmeyi tercih ederim.

1
@Eli "hemen hemen" burada anahtar terimdir. Haskell'de nasıl uygulanacağını düşünerek daha fazla zaman harcıyorsunuz, daha sonra uygulama oldukça kolaylaşıyor. Daha sonra haritalarınızın, kıvrımlarınızın, vb. Aklı başında olduklarından emin olmak için kontrol edin.
alternatif

@Eli Barzilay: Haskell'ın tip sistemi kesinlikle bir teorem kanıtı olmaya çok benziyor. Teoremin neredeyse diğer araçlardan daha yaygın göründüğü bir ortam yarattı . (Nedensel bir ilişki ima ettiğimden değil.)
greyfade

@luqui - Evet, kullandım; hayır, hala pratikte ve teoride yanlış bir ifade. Bu Haskell'e özgü bir şey değil.
Eli Barzilay

1

Dillerle ilgili tartışmalara kapılmanın kolay olduğunu düşünüyorum ve bu konuyu özlüyorum. Sadece FP'nin neyle ilgili olduğunu öğrenmek isteyen biri için, Ocaml / ML / Scheme / Haskell arasındaki farklar, onu öğrenmek için kullandığınız materyal (kitap, video, araç) ile olan rahatlığınızın yarısı kadar önemli değildir. Ve belli bir dili öğrenmenize yardımcı olacak bir arkadaşınız olup olmadığını, diğer her şeyi koyarsınız.


0

Saf değilse, zorunlu bir dil de kullanabilirsiniz, bu yüzden Haskell.


0

Sorunuza verdiğiniz cevaplardan birinde, bu bağlantıyı oldukça ilginç buldum , çünkü size Haskell ve Scheme'in tadına bakıyor.

Bu şık bağlantıya ek olarak, işte sorunuzu benim almam.

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

Dışarıda pek çok iyi dil var. Scala halkı, Clojure ve CL insanlarının yaptığı gibi dillerini dışa vuruyorlardı. Pythonistas bile tembellik iddia ediyor. Size cevap veren diğer kişiler ML'yi önerdi. Clojure'i Action'da yazan Amit Rathore , Haskell'i öğrenmenizi bile önerebilir.

Windows ve F # 'den bahsettiniz. Bu size şu anki pozisyonunuzda yardımcı olur mu? F # hakkında hiçbir şey bilmiyorum. Yeterince işlevsel mi? Bunu soruyorum, çünkü IMHO Python'un işlevsel yapıları var, ancak Clojure'da programlama yapmak gibi değil.

Özetlemek gerekirse, "gerçekten" işlevsel olan işlevsel bir dil öğrenin ve bunu yaparken durumunuz için en iyi anlam ifade edin.


-2

Göreceli bir başlangıç ​​bakış açısına göre, matematiğiniz oldukça olgunlaşmadıkça, Şemaya karar verirseniz SICP ile başlamamayı öneririm. Kitap ve videolar inceliklerle dolu ve yeni başlayan biri için hiç de sezgisel değil.

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.