我正在使用以下实现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
,那么它可以工作。我必须这样做吗?Haskell 的类型系统是否只是在欺骗我认为我应该能够做到这一点,而实际上如果没有完整的动态类型是不可能的?如果是这样,那么为什么我的代码甚至可以编译;为什么它假设整数?