Haskell: прочитать число (целое или с плавающей запятой)

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

5
задан mk12 4 March 2012 в 01:51
поделиться