2012-02-05 9 views
29

私が見てきた多くのHaskellチュートリアルでは、ほとんどすべての構文に集中しています。例えばHaskellプログラムの基本構造

...ここ

は、C++アプリケーションの最低限の概要です:私は最初にC++を学び始めたとき

#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; 
} 

、このような例は非常に個々の組み立て方法を学ぶに私を助けました作品を作業プログラムに組み込む。たぶん私は間違った場所を探しているかもしれませんが、ハスケルにとっては直接的で簡単な例は見つけられませんでした。

私はすでに多くのHaskell構文を知っています。私は再帰的リスト内包表記を書くことができ、文字列、整数を操作してwazooをリストすることができます。

簡潔に:私はちょうど2つのサブルーチンと変数パスがHaskellでどのように見えるか知りたいです。 Haskellプログラムをどのように構造化するかについて基本的な理解を得ることができたら、私が学んだすべての構文を最終的に使用することができます。

+2

私はhttp://www.haskell.org/haskellwiki/Haskell_in_5_stepsのような場所から始めたいと思います。私はClojureを学んでいます。しかし、私はO'Reilly Haskellの本を持っています。この本 - http://www.nostarch.com/lyah.htm - 良いレビューをたくさん得ているようです。 – octopusgrabbus

+3

これは正当な質問ですが、あなたがハスケルに多少間違っていると示唆することができます。 Haskellは可能な限り純粋な関数を強調しており、ほとんどのHaskellの実装では、定義した関数を使いこなせるREPL(read-eval-printループ)が提供されています。 stdoutに出力する小さなプログラムを作るのではなく、単に関数を書いてghciで再生することをお勧めします。私はあなたがHaskellを学ぶためにはるかに柔軟で楽しいと感じるでしょう。 –

+0

@DanBurton私は、先月構文を読んで、ghciの関数とリスト内包を使って遊んでいたのかもしれません。私は今すぐプログラムを作る準備ができています。 (:Dあなたは、私がHaskellに間違っていることを正しく示している。関数型プログラミング言語に手続き型プログラミングの原則を適用しようとしている。 –

答えて

32

Haskellプログラムの構造は驚くほど簡単です。あなたはIOを行うmain関数を持っています。それはそれです。だから、基本:

ghc --make Main.hs -o program 

を、それがプログラムと呼ばれる実行可能ファイルを生成する必要があります:

module Main where 

addition a b = a + b 

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

は今、あなたは次のようなものを使用した簡単なプログラムにこれをコンパイルすることができます。

一般に、プログラムは実際の計算を行う純粋な関数として、IOを扱うコードの個別の部分と結合されています。 (これにはもちろん例外はありますが、できるだけ多くの純粋なコードを書くという一般的な考え方はかなり普遍的です。)

ほとんどすべてが純関数の束として表現されているので、関数は引数を渡して通信します。

IOの部分はmainに固定されています。ほとんどの場合、すべてあなたのIOはメインを経由します。 IOアクションを別々に記述して名前を付けても、最終的にはmainから実行されます。

ハスケルの「機能グループ」は「モジュール」と呼ばれます。

module Blarg (exportedFunction) where 

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

括弧内の識別子のみが実際にエクスポートされます。残りは隠されています。カッコをまったく入れないと、デフォルトですべてがエクスポートされます。

Blarg.hsとして保存してください。今、あなたはMainでそれをインポートすることができます。

import Blarg 

グループ機能への別の有用な方法はwhereです:

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

この方法helpercomplicatedFunctionのみ範囲にあり、またabcへのアクセスを持っていますcomplicatedFunctionから。

+0

ご返信ありがとうございます。私はメインに精通していますが、他のサブルーチンを作るにはどうしたらいいですか? –

+3

あなたは本当に "サブルーチン"を持っていません、あなたは*関数*を持っています。突然変異がないので、これらの関数の引数として値を渡します(私の例では 'addition 5 3'のように)。 –

+0

右。私は、他の "機能グループ"をどうやって作っていますかと言っていましたか?基本的に、私はすべてをメインに置かないようにしています。 –