Yanıtlar:
En büyük sorunlardan biri, eğer Haskell gibi bir dille başlarsanız, diğer her şey standartların altında görünecektir.
Dürüst olmak gerekirse, Haskell veya şema gibi bir dille başlamak harika bir fikir olacağını düşünüyorum.
(Fonksiyonel dil bağımlısı olduğumu itiraf ediyorum) EDIT:
Tamam her iki dil hakkında ne gibi:
Şema çok basit bir dil alıyor ve ondan gelişim için mükemmel derecede sağlam bir dil oluşturuyor. Ayrıca SICP, orada öğrenmeye değer kılan şema hakkında yazılmıştır. Şema, tam bir dil olabileceğini hayal edebileceğiniz en basit şeyle ilgilidir.
Haskell Benim üzerimde gerçekten büyüyen şey tip sistem. Diğer dillerde gördüğüm hataların birçoğu, bir yerde gösterilen yanlış türden kaynaklanıyor. Haskell'de bu neredeyse imkansız. Ayrıca tembel bir dil fikrinden sadece bazı harika şeyler düşüyor. Örneğin Haskell'de sonsuz veri yapıları oluşturabilir ve daha sonra sadece ihtiyacınız olan parçayı oluşturabilirsiniz.
Bir OOP dili öğrenmeden önce fonksiyonel bir dil öğrenmenin en büyük artısı, programlama becerilerinizin önce geliştirilmesidir ve daha sonra OOP kavramlarını kolayca kavrayabilirsiniz. Doğrudan bir OOP diliyle başlıyorsanız, aynı anda iki şeyi öğrenmeniz gerekir: "kodu düşünmek" ve "OOD hakkında düşünmek". Dikkat dağıtıcı olabilir. Önce işlevsel bir dille pratik yapın ve programlama becerilerinizi geliştirin. OOP ve diğer paradigmaları öğrenin. OOP yapısal programlamadaki eksiklikleri telafi etmek istediği için nedenini anlamak daha kolay olacaktır. CS derslerinin C ile başlayıp C ++ 'a geçmesinin nedeni budur.
Fonksiyonel programlama ile başlayarak programlamanın nasıl öğrenileceği sorusu üzerine iki klasik öneri:
Birincisi ve bariz olanı, orada CS'ye en iyi girişlerden biri olan ve Şema kullanılarak fonksiyonel bir perspektiften öğretilen Abelson ve Sussman'ın klasik Bilgisayar Programları Yapısı ve Yorumudur. Bu var online full mevcuttur . Eğer buradan başlamazsan buraya bir nokta olarak gelmelisin.
Aynı zeminin çoğunu daha yumuşak bir hızda ve daha güçlü bir yazılım mühendisliğine odaklanan daha yeni bir metin , Matthew Felleisen ve Racket lehçesini kullanan Racket / PLT ekibinden bir dizi başka programın nasıl tasarlandığıdır . Şema. Bu var da mevcuttur online in-ilerleme olduğu gibi, ikinci baskı . Bu kitabın avantajı, yeni başlayanlar ve uzmanlar için kod denemesi için çok samimi bir arayüz sağlayan DrRacket programlama ortamı ile kullanılmak üzere tasarlanmasıdır.
Neden fonksiyonel programlamaya başlayacağım sorusu üzerine Bob Harper'ın Blog'una işaret etmek istiyorum . Carnegie Mellon kısa süre önce ilk önce işlevsel programlamayı öğretmek için CS müfredatlarını yeniden yapılandırdı ve Harper blogundaki ilerlemelerini adım adım anlatıyor. Standart ML tanımının arkasındaki adamlardan biri olarak, bu hareket için olduğu açık ve bunun nedenlerini iyi tartışıyor.
Sonunda, diğerleri katılmamalarına rağmen, önce Haskell öğrenmeye karşı dikkatli olurdum. Haskell'in FP'ye saf yaklaşımı kesinlikle iyi alışkanlıklar üretecek olsa da, dilin tembel hesaplamaya odaklanması yeni başlayanlar için iyi bir eşleşme değildir; bir programcı olarak yapmayı öğrenmeniz gereken ilk ve en önemli şeylerden biri, programınıza kaynağa bakarak tam olarak ne yaptığını ve aynı soruna farklı yaklaşımların göreceli maliyetini sorgulamaktır. Deneyimime göre, Haskell'in tembellik, her iki aktiviteyi de deneyimli programcılar için biraz zorlaştırıyor, ancak Kilometre Değişebilir.
FP ile başlamanın temel avantajı (veya dezavantajsızlığı), çoğu kavramın zorunlu programlama için de geçerli olabilmesidir. Raket Alemi, hem işlevsel hem de zorunlu kavramları öğretmek için video oyunu analojilerini kullanır ve özel öğrenciler sadece işlevsel bir oyunla (npi) değil, koşulların, özyinelemenin, döngülerin, ADT'lerin ve olay odaklı tasarımın sağlam bir anlayışıyla bırakılır. Bu kavramlar modern programlamada pratik olarak her yerde bulunur ve sürekli olarak kullanılır.
Bununla birlikte, daha da önemlisi, FP'nin üstün olduğu bir şey olan soyutlamaların üst düzey işlevlerin ve veri türlerinin kullanımıyla nasıl kodlanacağını öğrenmektir . Programları Tasarlama Tümevarım yoluyla öğreterek buna benzersiz bir yaklaşım getirir. Örneğin, öğrenciler fold
bir listenin hem toplamını hem de ürününü alma koduna bakarak, ortak yönlerini bularak ve uygulamayı kendileri türeterek nasıl çalıştığını öğrenirler.
Yukarıdakilerin OOP eşdeğeri muhtemelen aşağıdakilerden birini veya daha fazlasını içerecektir: arayüzler, soyut sınıflar, jenerikler, functorlar veya (yanlış yapıyorsanız) singletonlar. Bunlar Java'da mükemmel kabul edilebilir tasarım kalıpları olsa da, IMHO bir tanıtım müfredatına ait değildir ve sadece temel prensipleri gizlemeye hizmet eder. FP dillerine "geç" tanıtılan biri olarak bile, sürekli değişen OOP denizinde gezinmenin güçlü bir fonksiyonel çapa ile çok daha kolay hale getirildiğini söyleyebilirim.
RACKETEERS
. Ne zaman sona ereceğinden emin değilim, üzgünüm.
Fonksiyonel programlama işleri kolaylaştırır. OOP dillerinde, bu durumu bozmadan birden fazla iş parçacığında durumu yönetmekle uğraşmak zorundasınız. İşlevsel dillerde, yapılan işin çoğunluğu saf işlevlerle yapıldığında, bunun için endişelenmenize gerek yoktur.
Hız / performans açısından, ben gerçek bir performans jokeyi değilim, ama işlevsel olmak yavaş olmak anlamına gelmez ve fonksiyonel dillerin yapısının hızları ile ilgisi yoktur. İşlevsel dillerin sözdizimi Clojure ve Haskell arasındaki farklar gibi büyük ölçüde değişir. Clojure olduğu gibi çok hızlıdır ve gerçek sonrası optimizasyon ile Java hızlarına ulaşabilir (ve bazen aşabilir).
Yani hepsi gerçekten ne aradığınıza bağlı
Programlama dillerini öğrenirken öğrenme materyallerinin, bazı iyi kod örneklerinin ve mentorların kullanılabilirliğinin çok önemli olduğunu düşünüyorum. Durumunuza bağlı olarak, size öğretebilecek bir danışmanınız olabilir. Bu, ana dili öğrenmeye kıyasla daha yavaş ilerleyeceğiniz anlamına gelir. Ama aceleniz yoksa, o zaman bu bir sorun değildir.
Belki de fonksiyonel programlama dillerini öğrenmenin en önemli nedeni cebirsel veri türlerini anlamaktır. Zihinsel haritalama OO sınıfı ilişkilerin modellenmesine ve hatta veritabanı tasarımına yardımcı olacaktır.
Çok çekirdekli / çok işlemcili sistemlere odaklanma, FP'de daha net ve daha açık bir şekilde ifade edilebilen paralel algoritmaların kullanımını vurgulamaktadır. Lamda dillerinin şubesi, gelecek yirmi yıl içinde kullanımda güçlü bir artış görecektir.
Ancak bazı ortak tuzaklar da var. FP'nin daha basit olduğuna inanmak büyük bir hatadır, çünkü boşluk ve zaman karmaşıklığını hesaplamanın yanı sıra durma kanıtları sunmak, özellikle tembel değerlendirmeyi destekleyen dillerde lambda hesabında çok daha zor olabilir.
Yani, ikisini de öğrenin! Ya da belki de daha iyisi: önce Scala gibi her ikisini de kucaklayan bir dil öğrenin. Tie-die tişörtleri ve hafif bir Hollanda aksanı sakıncası yoksa, belki de Dr. Erik Meijer'in FP derslerini MSDN'de yararlı bulacaksınız .