【发布时间】:2012-03-22 00:54:04
【问题描述】:
我正在使用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 的类型系统是否只是在欺骗我认为我应该能够做到这一点,而实际上如果没有完整的动态类型是不可能的?如果是这样,那么为什么我的代码甚至可以编译;为什么它假设整数?
【问题讨论】:
-
文体小注:使用模式匹配比
isNothing和fromJust更好,所以if表达式可以替换为case input of Nothing -> getNum s; Just x -> return x。 -
谢谢,看起来好多了。
标签: parsing haskell input io typing