2012-02-21 58 views
2

我試圖加載下面的程序基本程序加載失敗(哈斯克爾)

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

但我得到的錯誤

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. 

我從gcd改變了函數名main和我

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

不要使用製表符作爲縮進。 – 2012-02-21 07:25:06

+0

@ MatveyB.Aksenov爲什麼會有特定的原因? – yayu 2012-02-21 18:31:04

+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不在範圍內或幾十個類似的帖子在這裏。 – 2012-02-21 23:22:00

回答

12

第一個錯誤應該是不言而喻的 - 一個名爲gcd的函數已經存在。

第二個也很簡單。在Haskell中,main是該程序的入口點。由於程序需要某種方式來執行IO,因此main必須具有IO a的形式,通常爲IO()。這意味着你應該致電gcd函數。 (Haskell中的main函數類似於Java中的main方法。)

通常的做法是將其稱爲gcd',它的發音爲「gcd prime」。在這種情況下,命名您的函數gcd'意味着它只是gcd的不同實現。