LISP ve Haskell kullanmanın avantajları nelerdir? Beni daha iyi bir programcı yapacaklar mı? [kapalı]


41

Lisp ve Haskell'in sırasıyla mantıksal ve işlevsel programlama dilleri olduğunu biliyorum, ama bu tam olarak ne anlama geliyor? Diğer dillerden farkı nedir? Bunları öğrenmenin seni daha iyi bir programcı yapacağını ve mantığını geliştireceğini duydum. Bu doğru mu ve Lisp veya Haskell'i yetkin bir seviyede öğrenmeye başlarsam, programım gelişir ve herhangi bir dilde herhangi bir sorunu çözmede daha iyi olur muyum? Sadece öğrenme çabasına değip değmeyeceklerini bilmek istedim. Ayrıca bu diller GUI ve grafik gibi alanlarda da faydalı mıdır yoksa sadece konsol uygulamaları için faydalı mıdır?


36
LISP ve Haskell'i kullanmak sizi daha iyi bir LISP ve Haskell programcısı yapacak, bunu garanti ediyorum.
Neil

17
@MasonWheeler Söylemem gereken; Haskell'in türünde başka hiçbir dilde bulamayacağınız pek çok şey var ve LISP makroları ana dilde hiçbir yerde bulunamıyor. Onlar çünkü bunlar her ikisi de değer öğrenme vardır do sizin çalışma dilde size daha iyi bir programcı olun. En azından bu benim deneyimimdi; Haskell beni daha iyi bir C # geliştiricisi yaptı. Endişelerimden hiç ayrılmayacağım şekilde temiz bir şekilde kaygıların uygulanmasına yönelik teknikleri biliyorum ve sorunları çözmek benim için Haskell'i öğrenmeden çok daha kolay olacak.
Jimmy Hoffa

6
Erlang işlevsel bir dildir. Rabbit MQ, Erlang'da yazılmıştır ve Rabbit, birçok yerde kritik ağır kaldırma yapmak için birçok yerde kullanılır. İşlevsel diller size programlama hakkında farklı düşünmeyi öğretir ve bu sizin emrinizde olması güzel bir ekstra araçtır. Bu kavramlardan bazıları onu daha popüler dillere çevirmiş olsa da (örneğin, C # ve C ++ 'daki lambda ifadeleri), işlevsel bir dil kullanırken problem çözmeye hala çok farklı bir şekilde yaklaşıyorsunuz.
Binary Worrier

8
@MasonWheeler Bir dilin diğerlerinden daha kullanışlı olmasının mükemmel bir nedeni vardır ancak yine de yaygın olarak kullanılmamaktadır. Pek çok şey düşünebilirim: mevcut kullanıcı tabanı, çok radikal bir değişiklik, "yeterince iyi" olduğunda ve ayrıca daha iyi bir araç daha resmi olarak eğitilmiş programcıları gerektirdiğinde. Bu yüzden popülerlik yararlılığın iyi bir ölçütü değildir .
Andres F.

5
@MasonWheeler Bir analoji kullanmak için, matematik gerçek hayatta oldukça faydalı bir alandır. Peki neden daha fazla insan matematikte uzman değil? Neden birçok insan ondan korkuyor ve bunun gerçekten de o kadar da kullanışlı olmadığını ve kara büyü olduğunu düşünüyor?
Andres F.

Yanıtlar:


37

Matematik öğrenmeyi analitik becerilerinizi geliştirecek ve latin / klasik edebiyatı öğrenmeyi yazma becerilerinizi geliştirecek gibi.

Bu dilleri tasarlayan insanlar, bir program yazmanın ne anlama geldiğini düşünmüşlerdir. Ve bu diller bu araştırmaların sonucudur.

Bununla birlikte, Java'yı öğrenmek sizi daha iyi bir programcı yapacak. Ve öğrenme C. Asıl faydaları, farklı felsefelerle dil öğrenmekten gelir. O zaman bir programın yazılması gerektiği hakkında kendi fikriniz olabilir.

Düzenle

Bu cevabın henüz haskell ve / veya lisp öğrenmemiş insanlar için çok faydalı olmadığını fark ettim. İşte ne demek istediğimi daha fazla açıklamak için bazı örnekler

LISP

Lisp, sözdiziminin minimum olması gerektiğine ve her şeyin bir liste veya ilkel olması gerektiğine inanmaktadır (Lisp, Liste İşleme anlamına gelir). Programlar bile çoğunlukla diğer listeleri ve sembolleri içeren listedir. Lisp, programları liste halinde değiştirmenize ve anında yeni programlar oluşturmanıza olanak sağlar. Dolayısıyla tüm code is data and data is codeslogan.

Sonuç, Lisp dillerinin istediğiniz herhangi bir arayüzü tanımlamanıza izin vermesidir. Güzel bir örnek, bir clojure web çerçevesi olan birleşiktir. İşte bir yönlendirme işlevi neye benziyor

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

Bir başka güzel örnek hıçkırık şablonlama çerçevesidir:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

Gördüğünüz gibi, sonuç bıyık gibi DSL kadar özlü, ancak gibi dil özelliklerini kullanmanıza izin veriyor (for [x (range 1 4)] block). Daha iyi bile olsa, kodunuzu tasarlamak ve yapılandırmak için tüm araçlara sahipsiniz.

Diğer dillerde, sözdizimi daha karmaşık. Bir Java programını liste halinde okuyamazsınız. Ancak Lisp'i kullanarak ideal bir arayüzün neye benzemesi gerektiği ve kodunuzda veri olarak soyutlanabileceği hakkında daha iyi bir fikir edinebilirsiniz. Ayrıca en sevdiğiniz dili büyük bir veri yapısı olarak görmenize ve anlamını daha iyi anlamanıza yardımcı olur.

Haskell

Haskell, güçlü statik yazım ve saflığa inanır. Saf fonksiyonlar matematiksel fonksiyonlara benzer: bir değer kümesinde tanımlanırlar ve bunları başka bir kümede eşler. Fonksiyonun yan etkileri yoktur ve değerler değişmezdir. Saflık ilginç çünkü çok paradigma bir dilin sahip olabileceği bir şey değil. Bir dil ya saf ya da değil.

Bunun bir sonucu, istediğiniz zaman GÇ eylemini gerçekleştirememenizdir (haskellers bunun iyi bir şey olduğuna inanmaktadır). IO eylemleri, kendileri saf değerler olan işlemler olarak tanımlanır. mainBir haskell programının değeri program çalıştırdığınızda yürütülen bir IO işlemidir.

Programınızdaki veri akışı ile açıkça ilgilenmeniz gerekir. Global bir değişkene bir şeyler yazıp okuyarak iki bileşenin iletişim kurmasını sağlayamazsınız. Değerler inşa etmek ve geçmek zorundasınız.

Jimmy Hoffa'nın bahsettiği bir diğer özellik ise zengin tip sistem. Diğer diller statik yazarken, haskell'de şöyle şeyler olabilir:

length :: [a] -> Int (Bir 's listesinden bir int' ye işlev)

map :: (a -> b) -> [a] -> [b](bir a to bdönüşümü ve bir 's bir listesini alır ve b' s bir listesini döndürür)

İşin güzel yanı, bu işlevin gerçekte ne yaptığını açıklamaya ihtiyacım olmaması: onların davranışlarını zaten anlıyorsunuz. Dahası, bu imzalara sahip fonksiyonlar gerçekten hiçbir şey yapamaz, bir listenin uzunluğunu hesaplar ve listedeki bir dönüşümü eşler.

Yazılan diğer dillerde, değişkenlikle birleştirilmiş sınıf hiyerarşileri bu tiplerle başa çıkabilmek bir kabustur. Dil perspektifinden (yani basit, güçlü ve güvenli) doğru olarak elde edilmesi imkansız olan kovaryans ve kontravaryans gibi şeyleri anlamanız gerekir.

Ya güvenli yoldan (skala gibi) geçersiniz ve gerçekten karmaşık bir dille karşılaşırsınız ya da basit yolu izlersiniz ve ya sınırlı olan bir şey alırsınız (ya da her zaman listelenen google go jenerikler) ya da güvensiz (dart jenerikler bildirdiğinden).

Haskell kullanarak, çoğunlukla saflığın faydalarını ve saf kodun nasıl yazılacağını öğrenirsiniz.


1
@JimmyHoffa Bence bu aslında kendi cevabını haketti, çünkü insanların göz ardı ettiği şey bu. İşlevsel programlama ile en iyi çözülen problem alanları vardır ki, insanların en azından kendi rahatlık bölgeleri dışındaki alanlarda etkileninceye kadar var olduklarını bile farketmezler.
KChaloux

2
Meclis'i bilmiyorum ve ben de ondan bahsetmedim. Ancak derleme, programlarınızın nasıl çalıştığını anlamanıza yardımcı olabilir. Bir performans sorununu açıklamak için üretilen bir montaj parçasını analiz edebilen SO hakkında çok büyük bir yazı var.
Simon Bergot

3
@KChaloux Cevabı ben yazardım ama bu sorunun kapatılması gerekiyor (buna göre oy kullandım). Basitçe söylemek gerekirse, fikrimi ve deneyimimi bir cevaba yazabilirim, fakat diğer cevaplardan daha doğru veya yanlış olmaz; sorun, dil önerisi soruları ve neden kapatmak için oy kullanmam.
Jimmy Hoffa

7
OMG, @Neil, bilgisayarın gerçekten en çok ne yaptığını bilerek sizi daha iyi bir programcı yapacak. Yıllardır montaj yazmamıştım ama düzenli olarak okudum (birçok platformda) ve programınızın gerçekte nasıl çalıştığını önemsiyorsanız, en azından temelleri bilmek önemlidir.
dash-tom-bang

3
@Neil, hangi durumda daha kötü bir programcı olmanın bir yararı var? Sana spagetti kodunu getiren nedir? Spagetti kodunun, montajı bilmeme ve öğrenmekten kaçınmak için rasyonelleştirmeye ihtiyaç duymama fantezisi dışında, montajla ya da iyi bir programcı olmakla ne alakası var? Herhangi bir şey varsa, iyi bir montaj kodlayıcı olmak bir tane kötü kodlama uygulamalarından haberdardır .
dash-tom-bang

12

tl; dr Yeni şeyler öğrenmek sizi daha iyi bir programcı yapabilir, ancak daha iyi bir programcı olmak, kod yazabileceğiniz dillerle ilgili değildir.

LISP ve Haskell kullanmanın avantajları nelerdir?

LISP:

  1. Homoikonik kod. Bu yapılandırılmış kendi kendini değiştiren kod sağlar.
  2. Sözdizimi duyarlı makrolar. Kazan plakası kodunun yeniden yazılmasına izin veriyorlar.
  3. Pragmatizm. CL, çalışan profesyoneller tarafından yapılan işleri almak için tasarlanmıştır. İşlevsel dillerin çoğu kural olarak değildir.
  4. Esneklik. Hepsi makul hızda birçok farklı şey yapabilir.
  5. Wartiness. Gerçek dünya dağınık. Pragmatik kodlama, dağınık yapıları kullanmak veya icat etmek zorunda kalmasına neden olur. Common Lisp, işleri halletmek için yeterince boşa gidiyor.

Muhtemelen CL'ye karşı seçim yapmak için tek gerçek neden, standart kütüphanelerin tarihli olmasıdır.

Bir uzuv üzerinde çıkacağım ve genel durumda, sözdiziminin profesyonel bir yazılım çalışanı için bir sorun olmaması gerektiğini söyleyeceğim.

Kimden: Lisp neden faydalıdır?

Haskell:

Haskell bir bilgisayar programlama dilidir. Özellikle, birçok diğer programlama dilden oldukça farklı, polimorfik olarak statik olarak yazılmış, tembel, tamamen işlevsel bir dildir. Dil, matematiksel mantıktaki çalışmaları fonksiyonel dillerin temelini oluşturan Haskell Brooks Curry'nin ismini taşıyor. Haskell lambda matematiğine dayanmaktadır, dolayısıyla logo olarak kullandığımız lambda.

Orada İşlevsel vs emperative bir açıklama okuyabilirsiniz

Gönderen: http://www.haskell.org/haskellwiki/Giriş

Beni daha iyi bir programcı yapacaklar mı?

Evet, elbette, daha fazla dil ve paradigma bilmek sizi yalnızca daha iyi bir programcı yapabilir, ancak şunu doğru anlayabilirsiniz:

Sizi daha iyi bir programcı yapacak tek bir araç, tek bir kitap, tek bir programlama paradigması yoktur.

Farklı paradigmalarla farklı programlama dilleri öğrenmek kesinlikle daha iyi bir programcı olmanıza yardımcı olur, farklı yaklaşımlarla sorunları çözmeyi öğrenmek de mantıklı düşünmenize büyük yarar sağlar.

İyi bir programcı olmak, dille ilgili değil, herhangi bir sorunu herhangi bir dilde çözme yeteneğine sahip olmakla ilgilidir. Ve dili bilmediğinizde, o dili hızlı bir şekilde öğrenme ve onu etkili bir şekilde kullanma yeteneği.

Bence, düşünceniz ne kadar küresel olursa, siz o kadar iyi geliştirici olursunuz.

Örneğin, kodunuza faydalı yorumlar ekleyebilir, kodunuzun okunabilirliğini ve bakımını dikkate alabilirsiniz. Küçük detaylara dikkat edin. Yazmadan önce düşünün! Tasarım kalıpları hakkında bilgi edinin. İyi uygulamaları takip edin.

Açıklama: Bu, en kötü türden utanmaz bir reklamdır, çünkü blogumdan geliyor.


4
LISP veya Haskell'i herhangi bir yetkin seviyede öğrendin mi?
Jimmy Hoffa,

10
Bunu, herhangi bir dilin yanında hiçbir şey bilmeyen birinden duymak biraz kafa karıştırıcı. Şu an ihtiyaç duydukları bir araç olmadığını iddia ediyorsun ama ne için bir araç olduğunu bilmiyorsun, peki bunu nasıl bilebilirsin? Ayrıca, LISP'in ilişkisel veri analizinde sadece faydalı bir SQL türevi olduğunu ve Haskell'in Regexp'in katı bir alt kümesi olduğunu bildiğiniz sürece, onlardan ne öğreneceklerini veya öğrenmeyeceklerini nasıl önerebilirsiniz.
Jimmy Hoffa

10
Bu soruya gerçekten cevap vermiyor. Bilmediğiniz iki dil hakkındaki bir soruya açık bir şekilde genel bir cevap vermenin etkileyici başarısını kazandınız: /
Andres F.

2
-1 çünkü bu belli belirsiz bir şekilde Common Lisp ve Haskell'in size öğrettiği şeylerle dans ediyor . Örnekler: Kod kodu, saflık, referans şeffaflık, monadic soyutlamalar, fonksiyonel programlama, dil dayalı programlama olarak Veri veri olarak, yönlendirilmiş programlama yazın vs vs vs
jozefg

3
Ayrıca her iki dili de bilmeme Bu soruyu cevaplayabileceğinizi sanmıyorum: / Üzgünüm
jozefg 09:13

9

Genellikle işlettiğiniz paradigmanın dışında kalan dilleri öğrendiğinizde, zihninizi gününüzdeki alternatif çözümlere açacaktır ve tercih ettiğiniz dilde bazı özellikleri daha iyi anlamanıza yardımcı olabilir. Bu dilleri bilmek, bu dillerden öğrendiğiniz dersleri alıp her gün gördüğünüz durumlara uygulayamazsanız, sizi daha iyi bir programcı yapmaz.

Söyleniyor, bu dillerle sınırlı değil. Daha önce görmediğiniz veya kullanmadığınız çeşitli veri yapılarını okuduğunuzda, bilgi kapsamını genişletmenize yardımcı olabilir, böylece bir dahaki sefere bir sorunla karşılaştığınızda, bir olası çözüm daha olur.

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.