2012-02-05 20 views
29

Haskell eğiticilerinin birçoğu, neredeyse bir programın nasıl yapılandırılacağına dair çok az kapsamı olan sözdizimine odaklanmıştım. ÖrneğinHaskell Programının Temel Yapısı

... İşte

bir C çıplak kemikleri anahat var ++ uygulaması:

#include <iostream> 
using namespace std; 

int addition (int a, int b) 
{ 
    int r; 
    r=a+b; 
    return (r); 
} 

int main() 
{ 
    int z; 
    z = addition (5,3); 
    cout << "The result is " << z; 
    return 0; 
} 

Ben ilk C++ öğrenmeye başladı, bunlar gibi örnekler gayet bireysel araya öğrenmede bana yardımcı oldu Çalışma programlarına ayrılır. Belki yanlış yerlere bakıyorum ama Haskell için doğrudan ve basit olan bu tür örnekleri bulamadım.

Zaten bir çok Haskell sözdizimini biliyorum. Yinelemeli liste anlatmalarını yazabilirim ve dizeleri, tam sayıları değiştirebilir ve wazoo'yu listeler.

Özet: Sadece iki alt yordamın ve değişken geçişin Haskell'de nasıl göründüğünü bilmek istiyorum. Bir Haskell programını nasıl yapılandıracağımıza dair bazı temel bilgiler edindiysem, sonunda öğrendiğim tüm sözdizimini bir miktar kullanabileceğim.

+2

http://www.haskell.org/haskellwiki/Haskell_in_5_steps gibi yerlere başlamak istiyorum Clojure'ı öğreniyorum. Ancak, O'Reilly Haskell kitabına sahibim ve bu kitap - http://www.nostarch.com/lyah.htm - çok iyi yorumlar alıyor gibi görünüyor. – octopusgrabbus

+3

Bu yasal bir soru olsa da, Haskell'e biraz yanlışa yaklaştığınızı önermeme izin verin. Haskell, saf işlevleri mümkün olduğu kadar vurgulamaktadır ve çoğu Haskell uygulaması, tanımladığınız işlevlerle oynayabileceğiniz bir REPL (okuma-değerlendirme-yazdırma döngüsü) sağlar. Stdout'a basan küçük programlar yapmak yerine, sadece işlevsellik yazarak ve onlarla birlikte oyun oynamanızı tavsiye ederim. Haskell'i öğrenmek için çok daha esnek ve eğlenceli olduğunu düşünüyorum. –

+0

@DanBurton Muhtemelen geçen ay söz dizimini okumaya çalıştım ve fonksiyonlarını ve liste kavramalarını ghci'de çaldım. Şimdi bir program yapmaya hazırım. (: D Haklı olarak Haskell'e yaklaşmakta haklısınız. Fonksiyonel programlama ilkelerini işlevsel bir programlama diline uygulamaya çalışıyorum. Hala bir grup işlevi bir şeye dönüştürmek için kafamı sarmaya çalışıyorum. Bir kez koşmaktan ve durmaktan daha fazlasını yapabilir. Okumaya devam edeceğim. –

cevap

32

Bir Haskell programının yapısı şaşırtıcı derecede basittir. IO yapan bir main işleviniz var ve bu konuyla ilgili. Yani temelleri:

ghc --make Main.hs -o program 

ve programın adı verilen bir çalıştırılabilir üretmek olmalıdır:

module Main where 

addition a b = a + b 

main :: IO() 
main = do let z = addition 5 3 
      putStrLn $ "The result is: " ++ show z 

Şimdi şöyle bir şey kullanarak basit bir programın içine bu derleme yapabilirsiniz. Genel olarak, programlar çoğunlukla IO ile ilgili kodun ayrı bölümleri ile birleştirilmiş gerçek hesaplamayı yapan çoğunlukla salt işlevler olarak yapılandırılmıştır. (Elbette bunun istisnası var, ama olabildiğince çok saf kod yazmanın genel fikri oldukça evrenseldir.)

Neredeyse her şey bir dizi saf işlev olarak ifade edildiğinden, aralarındaki değişkenleri geçmezsiniz. - işlevler argümanları ileterek iletişim kurar.

IO kodunuzu içeren kodun parçası main içinde sabitlenmiştir. Çoğu durumda, numaralı telefonun tümünün ana sayfasından geçecektir; IO eylemlerini ayrı ayrı yazsanız ve onlara isimler verseniz bile, bunlar en sonunda main'dan başlayarak yürütülür.

Haskell'de bir "işlev grubu", "modül" olarak adlandırılır. Birden modülleri olabilir, kendi dosyasındaki her:

module Blarg (exportedFunction) where 

helper a b = ... -- this will *not* be exported 
exportedFunction a b = helper a b -- this *will* be exported 

aslında ihraç edilecek parantez içinde Sadece kimlikleri; kalanlar gizlendi. Parantezleri hiç içermezseniz, her şey varsayılan olarak dışa aktarılır.

Bu dosyayı Blarg.hs olarak kaydet.Şimdi Main bunu ithal edebilirsiniz:

complicatedFunction a b c = helper 0 
    where helper count = ... 

Bu şekilde helper sadece complicatedFunction için dar olduğundan ayrıca a, b ve c erişimi vardır: grup işlevlerine

import Blarg 

Yararlı başka bir yolu where olduğunu complicatedFunction'dan.

+0

Cevabın için teşekkürler. Ana tanıdık geliyorum, ama diğer alt rutinleri nasıl yapabilirim ve bu alt rutinleri birbirleriyle iletişim kurar ve değişkenleri iletir mi? –

+3

Gerçekten "altprogramlara" sahip değilsiniz, * işlevleriniz var *. Mutasyon olmadığı için, değerleri bu fonksiyonlara argüman olarak iletirsiniz (örneğin benim örneğimde 5 5'e benzer). –

+0

Sağ. Demek istediğim, diğer "işlev grupları" nı nasıl yaparsın? Temel olarak, her şeyi anaya koymamayı deniyorum. –