2017-08-26 15 views
0

に私は戻ってオプションパーツへジャンプするプログラムを作りたいんや変数への値を割り当てない「表現」ハスケル - 別々のメイン=ブロック

私は機能を行うネストされたように作ってみました:

main = do 
... 
option = do 

、その後、私は唯一の「オプション」を行う、いくつかのケースでは呼ぶだろうが、このように動作していないようだと、私はどこでも任意の別の解決策を見つけることができませんでした。誰か助言をお願いしますか?

main = do 
putStrLn "Enter expression:" 
expression <- getLine 

putStrLn "Enter a number from 1 to 5:" 
putStrLn "1. Convert to Postfix" 
putStrLn "2. Convert to Prefix" 
putStrLn "3. Convert to Binary Expression Tree" 
putStrLn "4. Substitution" 
putStrLn "5. Evaluate Expression" 
choice <- getLine 

case (choice) of 
    "1" -> putStrLn $ toPostfix expression 
    "2" -> putStrLn $ toPrefix expression 
    "3" -> print (parse expression) 
    "4" -> do { putStrLn "Enter a variable: " 
       ; variable <- getLine 
       ; putStrLn "Enter a number: " 
       ; number <- getLine 
       ; print (sub expression variable number) 
       ; print (solvePostfix (toPostfix (sub expression variable number))) } 
    "5" -> print (solvePostfix (toPostfix expression)) 
    otherwise -> putStrLn "This is not a number from 1 to 5!" 
+0

あなたのコードには 'option'というものは何もありません。 'option'関数が正確に何をしたいのですか? – interjay

+0

私はちょうど "大文字"の前にループバックしたかったのですが、ユーザーが悪いオプションを入力した場合、新しいオプションを入力することができます – Mafi

+0

もう一度main関数を呼び出したくありませんでした。 – Mafi

答えて

5

私はこの質問を完全に理解していませんが、おそらくあなたはこのようなものを探しています。

main = do 
    putStrLn "Enter expression:" 
    expression <- getLine 

    putStrLn "Enter a number from 1 to 5:" 
    putStrLn "1. Convert to Postfix" 
    putStrLn "2. Convert to Prefix" 
    putStrLn "3. Convert to Binary Expression Tree" 
    putStrLn "4. Substitution" 
    putStrLn "5. Evaluate Expression" 
    choice <- getLine 

    let option = do 
     { putStrLn "Enter a variable: " 
     ; variable <- getLine 
     ; putStrLn "Enter a number: " 
     ; number <- getLine 
     ; print (sub expression variable number) 
     ; print (solvePostfix (toPostfix (sub expression variable number))) } 

    case (choice) of 
     "1" -> putStrLn $ toPostfix expression 
     "2" -> putStrLn $ toPrefix expression 
     "3" -> print (parse expression) 
     "4" -> option 
     "5" -> print (solvePostfix (toPostfix expression)) 
     otherwise -> putStrLn "This is not a number from 1 to 5!" 

または、あなたが代わりにループしたい場合:

main = do 
    putStrLn "Enter expression:" 
    expression <- getLine 

    let loop = do 
     putStrLn "Enter a number from 1 to 5:" 
     putStrLn "1. Convert to Postfix" 
     putStrLn "2. Convert to Prefix" 
     putStrLn "3. Convert to Binary Expression Tree" 
     putStrLn "4. Substitution" 
     putStrLn "5. Evaluate Expression" 
     choice <- getLine 

     case (choice) of 
      "1" -> putStrLn $ toPostfix expression 
      "2" -> putStrLn $ toPrefix expression 
      "3" -> print (parse expression) 
      "4" -> do 
      { putStrLn "Enter a variable: " 
      ; variable <- getLine 
      ; putStrLn "Enter a number: " 
      ; number <- getLine 
      ; print (sub expression variable number) 
      ; print (solvePostfix (toPostfix (sub expression variable number))) } 
      "5" -> print (solvePostfix (toPostfix expression)) 
      otherwise -> putStrLn "This is not a number from 1 to 5!" 

     loop -- restart loop from start 

    -- in main, start loop 
    loop 

をこのループは、ライブラリからforeverヘルパーを使用して達成することができ、それは基本的な再帰的な解決策を理解することが重要です。

+0

私はループバックしたかった。ありがとうございました。 :] – Mafi

関連する問題