Я использую эту реализацию maybeRead
:
maybeRead :: (Read a) => String -> Maybe a
maybeRead = fmap fst . listToMaybe . filter (null . dropWhile isSpace . snd) . reads
и мою собственную функцию getNum
, которая запрашивает, пока не получит действительный ввод:
getNum :: (Num a, Read a) => String -> IO a
getNum s = do
putStr s
input <- fmap maybeRead getLine
if isNothing input
then getNum s
else return $ fromJust input
Однако, если я введу5.2
он воспринимает это как плохой ввод. Почему?В моем коде ноль вхождений Int
и Integer
.Я использую только Num
, так как я хочу принять любой тип числа.
Если я назову его явно как getNum "Enter a number: " :: IO Double
, тогда это работает.Должен ли я сделать это?Разве система типов Хаскелла обманывает меня, заставляя меня думать, что я смогу сделать это, когда это действительно невозможно без полной динамической типизации?Если так, то почему мой код даже компилируется;почему он принимает целые числа?