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

これは何を意味するのでしょうか?

4

1 に答える 1

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

エラーメッセージは、Hugsが関数の最初の行が最後の行でもあると見なしているためです。(2行目は、最初の行の後ろにある部分までインデントされていませんdo。)

ところで、可能であれば(理想的にはHaskellプラットフォームの一部として)Hugsの代わりにGHCを使用してください。Hugsは数年間維持されていません。


エラーではありませんが、あなたが持っていることも奇妙に見えます

                 coin <- getChar;

と置換する

                 coin <- getChar

その他のエラー:

main = start
       return()

する必要があります

main = do start
          return()

または(持っている必要がないので、持っているmain :: IO ()ことができますmain :: IO anythingWeWant

main = start

そして最後に、あなたはあなたに電話をかけgetCharていますChar、それはあなたに番号を与えるかのようにあなたにパターンマッチングを与えます。数字を一重引用符で囲む必要があります(たとえば'1'、の代わりに1)。

于 2012-06-25T18:40:10.760 に答える