gpt4 book ai didi

parsing - Haskell:读取一个数字(整数或 float )

转载 作者:行者123 更新时间:2023-12-04 16:55:00 24 4
gpt4 key购买 nike

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

最佳答案

你的函数确实会接受 Integer , Float , 或任何其他 Num实例。但是,它接受哪种类型,以及它如何解析 String , 不是由它接收的输入决定的,它取决于结果应该是什么类型,具体取决于你对它的处理。

假设您使用 getNum并将结果值传递给需要 Float 的东西;在这种情况下,它将解析 Float值(value)。如果你将它传递给需要 Integer 的东西相反,它会解析它。

至于为什么假设Integer ,对于不明确的类型有一个“默认”系统specified in the Haskell Report ,并且规则说带有 Num 的模棱两可的类型约束应默认为 Integer .

关于parsing - Haskell:读取一个数字(整数或 float ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9551615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com