Haskell использует экземпляр чтения в основном с типом

Как можно использовать экземплярное чтение в моей основной?

Прямо сейчас у меня есть следующее:

data Term = Monom (Float,Int)
      | Addition (Term,Term)
      | Subtraction (Term,Term)
      | Multiplication (Term,Term)
      | Division (Term,Term)
      deriving(Show)


instance Read Term where
  readsPrec _ inp = let[(a,b)] = lex inp in
   case a of
   "x" -> readsPrec 0 b
   "^" -> [(Monom (1.0,(read b::Int)), "")]
   c  -> let[(d, "")] = readsPrec 0 b in
     [(Monom( (read c::Float),((\(Monom(x,y)) -> y) d)), "")]


--Aufruf: (read "2x^2")::Term


main :: IO ()
main = do
   putStrLn "Insert a Term:"
   inpStr <- getLine
   let outStr = (read inpStr)
   putStrLn outStr    

Это будет компилироваться/интерпретироваться, но когда я вызываю свой основной и ввожу «2x^2», он просто возвращает «2x^2» вместо Monom (2.0,2). Если вы позвоните (читай "2x^2")::Term, он будет работать нормально, но как мне это сделать в моем основном?

Обычно я бы просто вернулся

(read inpStr)::Term  

вместо putStrLn, потому что чтение реализует шоу, но интерпретатор сводит меня с ума... Любая помощь будет оценена


person user3327172    schedule 25.11.2014    source источник


Ответы (1)


Вы можете использовать квалификатор типа в let. Ваш main будет выглядеть так:

main :: IO ()
main = do
   putStrLn "Insert a Term:"
   inpStr <- getLine
   let outStr = read inpStr :: Term
   putStrLn $ show outStr 
person Tomo    schedule 25.11.2014