Haskell AND Lisp - Haskell VEYA Lisp [kapalı]


40

Şu anda C, C ++ ve Python ile kodluyorum. İşlevsel bir programlama dili seçmek istiyorum ve şu anda Haskell'e yaslanıyorum. Burada "Haskell vs Lisp" savaşı başlatmak istemiyorum; bilmek istediğim şey şudur: Haskell'i öncelikle işlevsel programlamaya maruz kalmak için öğrenirsem, daha sonra Lisp'i öğrenmekten ne gibi faydalar elde edeceğim?


1
Ve F # ve Clojure.
saat

Yanıtlar:


58

Her ikisini de öğrenmenizi öneririm, önce Haskell, sonra Common Lisp. Haskell ile olan deneyimim, statik yazmanın ilk başta kısıtlayıcı bir sıkıntı gibi göründüğü, ancak bir kere alıştığım zaman, yazım hatalarımın çoğunun arkalarında saklı mantık hataları olduğunu fark ettim. Bu noktaya ulaştığınızda ve türlerini düşünmeyi öğrenen ve kendi türlerinizi çözümünüzü ifade etme aracı olarak tanımlayan bir sonraki dönüm noktası, Common Lisp için hazır olacaksınız.

Common Lisp ile, Haskell'den monads, currying ve beğendiğiniz her şeyi ekleyebilirsiniz, fakat aynı zamanda Frank Shearar gibi çoklu kalıtım ve çoklu gönderme özellikli genel fonksiyonlar ve gelişmiş bir istisna işleme sistemi elde edebilirsiniz.

Öyleyse neden önce Common Lisp'i öğrenmiyorsun? Bir prosedürel ve OOP geçmişinden gelince, benim deneyimim, yalnızca kullanmam gerekinceye kadar işlevsel programlamayı gerçekten anlamadığımdı. İşlevsel programlama rahat olduğunda, Common Lisp'in sunduğu araçların geri kalanını ekleyebilir ve eldeki görevde en iyi olanı kullanabilirsiniz.


6
Sanırım çivilenmiş - Haskell ve Smalltalk'ı öğrenmek için bu kadar faydalı kılan şey saflıkları.
Frank Shearar

4
Saflığın bir dili öğrenmeyi daha kolay hale getirdiğine katılıyorum . İşlevsel dili LISP ile anlayamadım çünkü dilde her şey mümkün ve benim için çok fazla zorunlu OO geçmişi var. Fakat Haskell'de öğrenmeyi engelleyen böyle bir kavram yoktur.
Eonil

1
Komik, tam tersi bir deneyim yaşadım. Fonksiyonel programlamanın temel noktalarını ilk dilim olan Scheme ile aldım. Bazen Haskell'i hackledim ve kaçınılmaz olarak Haskell'den bir süre ne zaman ayrıldığımı bildiğim şeylerin% 90'ını tekrar öğrenmem gerektiğine karar verdim. Olduğu söyleniyor, Haskell inanılmaz derecede zengin bir dil, size öğretmek için çok büyük bir miktarla (çok zorla.) Türler Türler Türler Türler Türler! Türleri takip et!
Josh Infiesto

31

Ve lütfen.

Haskell size bildiğim kadarıyla en saf FP'yi, en azından farkında olduğum kadarıyla, Smalltalk'ın OO'nun en safını öğrettiği gibi. (OO ve FP'nin evlenemeyeceğini önermemekten bahsetmiyorum, fakat bu dillerin her ikisi de "mücevher" dilleri olduğundan - uç noktalara götürülen temel bir fikir.)

Lisp gerçekten bir dil ailesidir, bu yüzden kullandığım ailenin özel üyesi olan Common Lisp hakkında konuşacağım.

Lisp'in sana öğretecek çok şeyi olacak:

  • Bu çok paradigmadır, bu nedenle dsimcha , FP'yi diğer paradigmalarla nasıl entegre edeceğinizi gösterecektir.
  • Lisp size "kod-veri, veri-kod" olduğunu, örneğin makroları aracılığıyla öğretecektir.
  • CLOS, işe yarayan çoklu kalıtım ve genel işlevler içeren çok ilginç bir OO markasıdır.

11

Lisp'i daha sonra öğrenmek, muhtemelen en gelişmiş metin editörü olan Emac'leri özelleştirmenize izin verecektir. Bunu Haskell'de yapamazsın.


14
[Parantezlerini keskinleştirir]
Inaimathi 13:10

6
Belki birileri bunun için bir metin editörü yazabilir. Emacs işletim sisteminin bir gelmediğini duydum. (Ben
şaka yapıyorum

14
Aslında, Haskell'in aynısını Emacs'in Lisp kullandığı gibi kullanan Yi adında bir Emacs-klonu var. Aslında, (GNU) Emacs ile karşılaştırıldığında, Yi daha da saftır, çünkü çekirdeği Haskell'de de yazılmıştır, oysa Emacs çekirdekleri genellikle Lisp'te yazılmamıştır. GNU Emacs'ın çekirdeği C, JEmacs 'Java ile yazılmıştır.
Jörg W Mittag

2
@ Jörg, tam GNU Emacs veya XEmacs klonu yerine kısmi bir yeniden uygulama ise, aynı şey değildir. Word ile Wordpad veya Not Defteri'ni karşılaştırmaya benzer.

1
@ Thorbjørn Ravn Andersen: Evet, ama o kadar da kötü değil . :)
greyfade 14:10

11

Haskell ve Lisp iki farklı hayvandır.

Haskell "fildişi kulede saf fonksiyonel programlama" türünden

Lisp, "kod-veri-veri / veri-kod / kendi dil yapınızı yaratın" türündedir. Kodunuzu, hayal edebileceğiniz herhangi bir şekilde değiştirebilirsiniz.

Onlar çok farklı. Her ikisi de "işlevsel programlama" özelliğini paylaşıyor, ancak bu, farklılıklarına kıyasla gerçekten küçük bir ortak nokta. Sadece onları deneyin ve ne kadar farklı olduklarını göreceksiniz!


+1: İyi nokta. Biraz Haskell ve biraz Lisp biliyorum. İkisinde de uzman olmasam da, onların çok farklı oldukları konusunda haklı olduğunuzu düşünüyorum. Haskell'de verileri kod olarak kullanma fikriniz yoktur. Lisp'te (AFAIK) desen eşleşmesine sahip değilsiniz. Muhtemelen farklılıkların listesi (!) Uzundur.
Giorgio

7

Lisp'i öğrenmekten gördüğüm en büyük yarar, sadece saflığı vurgulayan bir akademik dil bağlamında öğrenmekten ziyade, FP'yi gerçek dünyaya yönelik çoklu paradigma diline nasıl entegre edeceğinizi öğrenmektir.


5
Sanırım "Haskell vs Lisp" savaşı istiyorsun!
Don Roby,

3
Haskell olan saflığı vurgulayan bir akademik dil ... ve bir sürü insan gerçek dünyada kullanırız. Smalltalk da o kampta.
Frank Shearar

Birçok insan gerçek dünyada Haskell kullanıyor mu?
Jon Harrop

1
@Jon Harrop: Eh, gerçek dünyada Haskell kullanıyorum (ve bazı uygulamalar için gerçekten iyi çalışıyor), belki de birkaç kişiden biriyim (?)
Giorgio

5

Ayrıca bir C / C ++ / Python geçmişinden geliyorum ve FP'yi son birkaç yılda birkaç kez denedim. Başlangıçta Haskell'e baktım ve kafasını ya da kuyruğunu başaramadım, sonra Ocaml'ı denedim ama bundan daha fazla alamadım. Sonunda Scala hakkında iyi şeyler duymaya başladım, denedim ve çok iyi bir şekilde (geçmişte biraz da Java yaptım) uygun buldum. Euler ile ilgili problemler proje), Haskell çok daha mantıklı görünüyor. Aslında, Haskell hakkında birkaç kitap ısmarladım ve Scalaz'ın varlığından büyük ölçüde istekli olmasına rağmen, başka bir şey daha vermek istiyorum.

Bu yüzden çoklu paradigma dilini kullandım (yani Scala, fakat Lisp de tasarıya uygun olabilir) FP'ye iyi bir yol buldum. Ama Haskell'e dalmaktan mutluysanız (ben değildim), bunun için gidin.


Scala ile OCaml'dan daha ileri gitmeniz ilginç. Nasıl olur?
Jon Harrop

@Jon: Güzel soru; Söylemesi zor. Belki de o zamanlar işlevselliğe "girmeye" hazır değildim. Belki de doğru seviyeye ayarlanmış bir Scala öğretmeni buldum. Belki Scala'nın C / C ++ / Java soyu biraz daha az yabancı yaptı. Bu günlerde akılcı bir bahis verildiğinde, Scala yerine F # 'da olacaktı, muhtemelen OCaml alanını bir noktada tekrar ziyaret edeceğim, ancak bu şeyle sadece C ++' a farklı bir "programlama zihniyetine girme zevkinden keyif aldığım için. dayjob, Haskell'i tekrar denemek için sapık bir eğilimim var.
pazartesi

Düzgün hareketli yaklaşım :)
Eonil

2

Başlangıçta bir C / C ++ / Ruby geçmişinden geldim ve Ruby'de FP kavramlarını ne zaman istersem kullandım. Devlet az önce beynime zarar verdi. Arkadaşlarımdan biri bir gün beni aradı ve Haskell'de bir şeyler yazmamı istedi (ilk - ve umarım son değil - Haskell işi!). Dili hızlıca öğrendim ve birlikte çalışan bir şey fırlattım. Güzel ya da hiçbir şey değildi ama işe yaradı.

Haskell'den bir ay mola verdim çünkü kullanacak hiçbir şeyim yoktu. Ancak kendi blog yazılımımı yazmam gerektiğine karar verdiğimde Haskell ( https://symer.io ) kullandım. Haskell gerçekten harika çünkü bir sorunu parçalara ayırabilir ve bu parçaları girdilere göre farklı şekilde uygulayabilirsiniz. Haskell ayrıca, akıllı değer boksuyla hatayı çok iyi idare eder. Bu kutularla çalışacak pek çok araç var, sadece var olduklarını unutursunuz.

Lisp (Scheme) ile olan deneyimim tamamen olumsuzdu. Dil bu akıllı, basit araçlardan yoksun kalmadı, Ruby ya da JavaScript kadar tehlikeli bir his verdi. Korkunç bir deneyimdi ve Ruby veya Python'un ötesinde yeni bir şey sunmuyor.

C ++ hafıza yönetimi dışında Haskell'e bir mum tutamaz. Haskell kadar hızlı (daha hızlı değilse), çok daha özlü ve çok daha güvenli. Fakat Haskell'in güvenliği asla engel olamıyor.

TL; TR Haskell temiz havanın nefesi, Lisp biraz daha işlevsel bir yakut.

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.