私はHaskellを習っており、このプログラムを実装しようとしています。私はカスタムデータ型を持っていますカスタムデータ型とパラメータの比較
data CalculatorInput
= Exit
| Error String
| Operator (Int -> Int -> Int)
| Number Int
この場合、このタイプの値を返すメソッドgetInput
があります。
今、このタイプの値をディスパッチする方法が混乱しています。私は、入力が私もcase
を使用しようとしたNumber x
であるかどうかを知りたいの方法
simpleCalculator :: Int -> (Int -> Int -> Int) -> IO()
simpleCalculator ans op = do
input <- getInput -- here i got the type as result
if input == Exit then return()
else if input == Number x then ans = ans op x; print ans
else simpleCalculator ans op
あります
simpleCalculator :: Int -> (Int -> Int -> Int) -> IO()
simpleCalculator ans op = do
input <- getInput -- here i got the type as result
--case input of
-- Exit -> return()
-- Error x -> print x
-- Number n -> ans = ans op x; print ans -- getting error here, multiple statement not possible
-- _ -> simpleCalculator ans op
私もEq
のインスタンスを作成しようとしましたが
instance Eq CalculatorInput where
(==) Exit Exit = True
(==) (Number x) (Number y) = x == y
(==) _ _ = False
カスタムデータを比較する方法case
ブランチ内にパラメータを持つ型または複数の文を持つことはできますか?
@MathematicalOrchid。それはうまくいかなかった。私は試した。また、ans = op ans nとすると、それはinifniteループになることに気づくでしょう。 –
@WaqarAhmedm 'let ans = op ans n' - これは再帰的に*それ自身で' ans'を定義します。あなたは新しい名前を使う必要があります。この場合、たいていは素数 '' 'を使用します:' 'ans '= op ans n' – luqui
@ luqui..i got..thanks。もう1つの質問ですが、なぜsimpleCalculatorメソッドから値を返さないのは良いと思いますか? –