Почему функция чтения не требует аргумента синтаксического анализа в этом случае

#haskell

#haskell

Вопрос:

Из книги Грэма Хаттона «Программирование на Haskell»:

 import Data.Char

getNat :: String -> IO Int
getNat prompt = do putStrLn prompt
                   xs <- getLine
                   if xs /= [] amp;amp; all isDigit xs then
                     return (read xs)
                   else
                     do putStrLn "ERROR: Invalid number"
                        getNat prompt
  

Для функции чтения нет аргумента синтаксического анализа, и все же хорошие входные данные анализируются в Int. Как это возможно?

Ответ №1:

Haskell может определить, какой экземпляр Read использовать из другого типа.

getNat есть тип String -> IO Int , поэтому return (read xs) должен быть тип IO Int . Мы знаем, что return имеют тип Monad m => a -> m a , в нашем случае a Int , поэтому мы можем сделать вывод, что read xs имеют тип Int .

Теперь нам просто нужно найти экземпляр Read Int , который существует.