Сравнение пользовательского типа данных с параметрами

Я изучаю 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,

Другие вопросы по тегам