#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
, который существует.