2012-02-21 9 views
2

私は次のプログラム小学校プログラムは(ハスケル)のロードに失敗し

gcd a b = if b == 0 
     then a 
     else gcd b (rem a b) 

をロードしようとしています。しかし、私は、私はgcdからmainに関数名を変更し、私が得る

Prelude> :l euclidean.hs 
[1 of 1] Compiling Main    (euclidean.hs, interpreted) 

euclidean.hs:3:8: 
    Ambiguous occurrence `gcd' 
    It could refer to either `Main.gcd', defined at euclidean.hs:1:0 
          or `Prelude.gcd', imported from Prelude 
Failed, modules loaded: none. 

エラーが出ます

Couldn't match expected type `IO t' 
      against inferred type `a -> a -> a' 
    In the expression: main 
    When checking the type of the function `main' 
Failed, modules loaded: none. 

私はこれを理解していません。私はここでworkshopのステップを使用しています。

+5

インデントとしてタブを使用しないでください。 –

+0

@ MatveyB.Aksenov具体的な理由はありますか? – yayu

+0

Haskellのタブは8つのスペースとして定義されています。これはあなたの(またはあなたの共同編集者)エディタがそれらを表示する方法ではなく、混乱するエラーにつながります。 http://stackoverflow.com/questions/1269888/invisible-identation-error-in-haskell-caused-load-fail-in-ghciまたはhttp://stackoverflow.com/questions/1694097/haskell-compiler-errorを参照してください。スコープがない、または数十もの類似の投稿がここにあります。 –

答えて

12

最初のエラーは自明である必要があります。gcdという名前の関数が既に存在しています。

2番目の方法も簡単です。 Haskellでは、mainがプログラムのエントリポイントです。プログラムでIOを行うには何らかの方法が必要なので、mainの形式はIO aの形式(通常IO())でなければなりません。つまり、gcd関数を呼び出す必要があります。 (Haskellではmain機能はJavaでmain方法に似ています。)

通常の練習は、「GCDプライム」と発音され、gcd'それを呼び出すことです。この場合、関数gcd'の名前は、それがgcdの異なる実装であることを示しています。

関連する問題