Сравнение пользовательского типа данных с параметрами
Я изучаю Haskell и пытаюсь реализовать эту программу. У меня есть пользовательский тип данных
data CalculatorInput
= Exit
| Error String
| Operator (Int -> Int -> Int)
| Number Int
тогда у меня есть метод getInput
который возвращает значение этого типа.
Теперь я запутался, как отправлять значения этого типа. У меня есть метод
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
Я хочу знать, является ли вход Number x
Я пытался использовать case
также:
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
ветка?
2 ответа
Вы почти на правильном пути с вашим нерабочим кодом:
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
_ -> simpleCalculator ans op
Вы можете вложить do
нотации, позволяющие написать следующую правильную программу:
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 -> do
let theAns = ans op x
print theAns
_ -> simpleCalculator ans op
Для Eq
Например, вы можете позволить компилятору сделать работу за вас, используя деривацию, т.е.
data CalculatorInput
= Exit
| Error String
| Operator (Int -> Int -> Int)
| Number Int
deriving Eq
Использование case
,
simpleCalculator ans op = do
input <- getInput -- here i got the type as result
case input of
Exit -> return ()
Number x -> print $ans `op` x
_ -> simpleCalculator ans op
Вы не можете получить Eq
за CalculatorInput
потому что функции не являются экземплярами Eq
,