SORU
1 Mayıs 2009, Cuma


Yeni başlayanlar için Haskell veya Standart ML?

Ayrık yapılar içinde alt bölüm dersi için gidiyorum. Fonksiyonel bir programlama dili ile uygulama için elverişli örnekler ve kavramları içerdiği için metin kitap *11 bölüm olarak seçtim. (Ben de iyi bir kitap olduğunu düşünüyorum.)

DS kavramları göstermek ve öğrencilerin kullanabileceği kolay anlaşılır FP bir dil istiyorum. Çoğu öğrenci için en iyi Java programlama için sadece bir ya da iki dönem vardır. Düzeni, Ayrık, Haskell, Bunun, ESM baktıktan sonra, ya da Haskell veya Standart ML karar verdim. Nedenleri aşağıda Haskell için doğru eğilmiş değilim, ama ya diğeri aktif programcılar olanların fikrini istiyorum.

  • Hem Haskell ve ESM var özyinelemeli algoritma bir çocuk oyuncağı açıklayan yapar, desen eşleştirme.
  • Haskell güzel böyle listeler matematiksel olarak ifade edilmiştir yol ile eşleşen güzel liste üreteçleri vardır.
  • Haskell tembel değerlendirme var. Sonsuz listeleri anlama tekniği kullanılarak inşa için harika.
  • ESM işlevleri tanımlanmış ve kullanılan her ikisi de olabilir gerçekten interaktif bir tercüman var. Haskell, fonksiyonları etkileşimli kabuk kullanılmadan önce ayrı bir dosyada tanımlanmış ve derlenmiş olması gerekir.
  • ESM kolay anlaşılır bir sözdizimi işlev bağımsız değişkeni ve dönüş türleri kesin onay verir. Örneğin: val foo = fn : int * int ->int. Haskell'ın örtülü köri sözdizimi biraz daha geniş, ama tamamen yabancı değil. Örneğin: foo :: - ^ İnt . - ^İnt . İnt.
  • Haskell varsayılan olarak hassas rasgele tamsayı kullanır. ESM/NJ harici bir kütüphane. Ve ESM/NJ varsayılan olarak 70 karakter çıkışı keser.
  • Haskell'ın lambda sözdizimi, tek bir ters eğik çizgi kullanır ince. ESM daha belirgindir. Eğer şimdiye kadar bu sınıfta lambda de ihtiyacımız olacak mı emin değilim.

Aslında, ESM ve Haskell kabaca eşdeğerdir. Haskell liste kapsam ve sonsuz listeleri sevgi dolu olduğum için Haskell doğru eğildim. Ama Haskell kompakt sözdizimi sembol geniş sayıda öğrenci sorunlarına neden olabilir diye korkuyorum. Bu YÜZDEN diğer mesajları okumaya anladığım kadarıyla, Haskell yeni başlayanlar FP ile başlayan için tavsiye edilmez. Ama tam teşekküllü uygulamalar, basit algoritmalar deniyorum olacağız.

Ne düşünüyorsun?

< / ^ hr .

Büyük yanıtlarınızı okumak, kurşun benim bazı noktaları açıklığa kavuşturmalıdır. Üzerine Edit:

ESM, yorumlayıcı bir işlev tanımlama ve harici bir dosya bu tanımlama arasındaki sözdizimsel farklılıklar vardır. Hadi faktöriyel işlevi yazmak istediğini söyle. Haskell bir dosya içine bu tanım koymak ve GHCi yükleyebilirsiniz:

fac 0 = 1
fac n = n * fac (n-1)

Bana göre bu açık, özlü, ve kitapta matematiksel tanımına uyuyor. Ama eğer GHCi işlevi doğrudan yazmak istiyorsanız, farklı bir sözdizimi kullanmanız gerekir:

let fac 0 = 1; fac n = n * fac (n-1)

İnteraktif tercüman ile çalışırken, bir öğretim açısından öğrenci dosyası ve komut satırı hem de aynı kodu kullanabilir ve çok kullanışlı.

"İşlevi açık onayı" işlevi tanımlama üzerine, ESM hemen fonksiyonun adını, bağımsız değişken türleri ve dönüş türü söyler demek istedim. Haskell kullanımı :komutu yazın ve sonra da biraz kafa karıştırıcı köri gösterimde.

Haskell hakkında daha havalı bir şey bu geçerli bir işlev tanımı

fac 0 = 1
fac (n 1) = (n 1) * fac n

Yine, bu ders kitabında bulabilirler tanımına uyuyor. Bunu ESM giremezsin.

CEVAP
1 Mayıs 2009, Cuma


Haskell çok seviyorum, burada ayrık Matematik ve veri yapıları bir sınıf için ESM tercih ederim nedenlerden (ve diğer çoğu yeni başlayanlar sınıflar):

  • Zaman ve Haskell programları alanı maliyetleri, hatta uzmanlar için tahmin etmek çok zor olabilir. ESM makine uçurmak için çok daha sınırlı yollar sunar.

  • Etkileşimli yorumlayıcı işlevi Definition için sözdizimiaynısözdizimi için bir dosyada kullanılan, kesip yapıştırabilirsiniz.

  • ESM operatör aşırı yükleme tamamen sahte olsa da, aynı zamanda basit. Sabit tip derslere girmek zorunda kalmadan Haskell bütün bir Dersim olacak.

  • Öğrenci print kullanarak hata ayıklama.

  • Sonsuz veri yapıları darbe insanların kafasında. Yeni başlayanlar için, onları bir akış tipi ref hücreleri ve thunk ile tam tanımlamak zorunda sen iyisi mi, nasıl çalıştığını biliyorum:

    datatype 'a thunk_contents = UNEVALUATED of unit -> 'a
                               | VALUE of 'a
    type 'a thunk = 'a thunk_contents ref
    val delay : (unit -> 'a) -> 'a thunk
    val force : 'a thunk -> 'a
    

    Şimdi daha fazla sihir değil, ve akarsu (sonsuz listeler) için buradan gidebilirsiniz.

  • Düzen Python gibi basit değil ve kafa karıştırıcı olabilir.

Bir kenar Haskell iki yer vardır:

  • Çekirdek Haskell sadece tanımını önce bir fonksiyon tipi imza yazabilirsiniz. Bu öğrenciler ve diğer yeni başlayanlar için son derece yararlı. Sadece ESM yazın imza ile başa çıkmak için iyi bir yol yoktur.

  • Haskell daha somut sözdizimi vardır. Haskell sözdizimi ML sözdizimi önemli bir gelişme. short note about when to use parentheses in an ML program; bu biraz yardımcı olur diye yazdım.

Son olarak, iki ucu keskin bir kılıçtır

  • Haskell kodu varsayılan olarak saf, öğrencilerin kirli yapıları (İO monad, devlet monad) kazara üzerinde yanılmak olası değildir. Ama aynı şekilde, yazdıramaz, ve eğer G/Ç yapmak istiyorsan o zaman en az do gösterim açıklaman gerekir, ve return kafa karıştırıcı.

< / ^ hr .

İlgili bir konu üzerinde, burada ders hazırlık için tavsiyeler: Chris tarafından Purely Functional Data Structures Okasaki. göz ardı etmeyin Eğer öğrencileriniz kullanmak zorunda olsa bile, kesinlikle bir kopyasını yapmak isteyecektir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Justin Schenck

    Justin Schen

    24 Kasım 2006
  • Kim Barbin

    Kim Barbin

    3 Mayıs 2012
  • Techmoan

    Techmoan

    31 Mayıs 2009