Я использую эту реализацию 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 "Введите число: " :: IO Double
, то это сработает. Должен ли я это делать? Неужели система типов Haskell просто обманывает меня, заставляя думать, что я должен быть в состоянии сделать это, когда на самом деле это невозможно без полной динамической типизации? Если да, то почему мой код вообще компилируется; почему он предполагает целые числа?