Переменная неоднозначного типа, которая предотвращает ограничение - PullRequest
0 голосов
/ 26 июня 2018

Я возился с IO, и я не понимаю следующее ошибка :

* Ambiguous type variable `a0' arising from a use of `readLine'
      prevents the constraint `(Console a0)' from being solved.
      Probable fix: use a type annotation to specify what `a0' should be.
      These potential instance exist:
        instance Console Int -- Defined at Tclass.hs:8:14
    * In the second argument of `(+)', namely `readLine'
      In the second argument of `($)', namely `(2 + readLine)'
      In the expression: putStrLn . show $ (2 + readLine)
   |
17 |     useInt =putStrLn . show $ (2+readLine)

Код

module Tclass where
    import System.Environment

    class Console a where
        writeLine::a->IO()
        readLine::IO a

    instance Console Int where
        writeLine= putStrLn . show 

        readLine = do
            a <- getLine
            let b= (read  a)::Int
            return b

    useInt::IO()
    useInt =putStrLn . show $ (2+readLine)  

P.S я не понимаю, должен ли компилятор выводить тип экземпляра для readLine и добавлять с помощью 2 в методе useInt?

1 Ответ

0 голосов
/ 26 июня 2018

2 - это не только Int в Haskell, но и любой числовой тип, включая Float,Double,Integer,.... Его тип Num a => a - полиморфный тип, соответствующий каждому числовому типу.

Итак, вы можете использовать (2::Int) вместо этого. Затем вы обнаружите, что (2::Int) + readLine является ошибкой типа, поскольку readLine :: Int неверно, мы получаем только readLine :: IO Int.

Вы можете попробовать это вместо

useInt :: IO ()
useInt = do
   i <- readLine
   putStrLn . show (2 + i :: Int)
...