2012-06-25 21 views
0

我需要在Haskell中製作一臺可樂自動售貨機,但我遇到了一些問題。我不明白,Haskell的非常好,所以我不知道發生了什麼未解決的頂級超載

main = start 
     return() 

start = do putStr "\nSelect a coin\n1. R$0,25\n2. R$0,50\n3. R$1,00\n" 
      coin <- getChar; 
      case coin of 
       1 -> twentyFive 
       2 -> fifty 
       3 -> dispensed 
       otherwise -> do putStr "Select a valid option" 
           start 

twentyFive = do putStr "\nSelect a coin\n1. R$0,25\n2. R$0,50\n3. R$1,00\n" 
       coin <- getChar; 
       case coin of 
        1 -> fifty 
        2 -> seventyFive 
        3 -> dispensed 
        otherwise -> do putStr "Select a valid option" 
            twentyFive 

fifty = do putStr "\nSelect a coin\n1. R$0,25\n2. R$0,50\n3. R$1,00\n" 
      coin <- getChar; 
      case coin of 
       1 -> seventyFive 
       2 -> dispensed 
       3 -> dispensed 
       otherwise -> do putStr "Select a valid option" 
           fifty 

seventyFive = do putStr "\nSelect a coin\n1. R$0,25\n2. R$0,50\n3. R$1,00\n" 
       coin <- getChar; 
       case coin of 
         1 -> dispensed 
         2 -> dispensed 
         3 -> dispensed 
         otherwise -> do putStr "Select a valid option" 
             seventyFive 

dispensed = do putStr "-- Coke Dispensed --" 
       return() 

但我收到此錯誤:

Unresolved top-level overloading 
*** Binding    : seventyFive 
*** Outstanding context : Num Char 

這是什麼意思?

+0

你說過你是Haskell的新手,所以也許你不知道'return()'不是必須的,'getChar'結尾的';'也不需要。 – Artyom

+0

你可能應該給你的函數顯式類型簽名,它可以使這樣的錯誤更清晰。 –

回答

2

你沒有縮進seventyFive的主體,就像縮減其他函數的主體一樣。

應縮進這樣,而不是:

seventyFive = do putStr "\nSelect a coin\n1. R$0,25\n2. R$0,50\n3. R$1,00\n" 
       coin <- getChar 
       case coin of 
         1 -> dispensed 
         2 -> dispensed 
         3 -> dispensed 
         otherwise -> do putStr "Select a valid option" 
             seventyFive 

錯誤信息是因爲擁抱認爲你的函數的第一線,也是最後一道防線。 (你的第二行沒有縮進到do之後的第一行的那一部分。)

順便說一下,如果可以的話(最好是Haskell平臺的一部分)使用GHC而不是Hugs,因爲Hugs擁有沒有維持幾年。


不是錯誤,但它也看起來很奇怪,你有

    coin <- getChar; 

替換

    coin <- getChar 

多個錯誤:

main = start 
     return() 

應該

main = do start 
      return() 

或(因爲我們不必有main :: IO(),我們可以有main :: IO anythingWeWant)剛剛

main = start 

最後,你在呼喚getChar,它會給你一個Char ,但模式匹配就好像它給了你一個數字。您需要將該數字用單引號引起來(例如'1'而不是1)。

+0

當我在這裏粘貼代碼時,這是一個問題,代碼正確縮進,但錯誤仍然存​​在 – Jorgel

+0

如果您在源代碼中使用選項卡,請用空格替換它們。 – dave4420

+0

我沒有使用標籤 – Jorgel