gpt4 book ai didi

haskell - IO中如何正确使用readMaybe函数

转载 作者:行者123 更新时间:2023-12-03 15:05:53 28 4
gpt4 key购买 nike

大约 4 个月前,我开始在 Haskell 中编程,现在我不得不处理 Haskell 的 IO 系统。
我已经做了很多 IO 操作,并没有遇到任何我自己无法解决的问题,但是这次我搜索了将近两个小时,无济于事,以获取有关函数 readMaybe 的一些信息。所以我有以下问题要解决,我已经尝试了很多不同的方法来解决它,但我总是从我的编译器收到相同的失败消息:

No instance for (Read a0) arising from a use of `readMaybe'
The type variable `a0' is ambiguous

我了解编译器确实想告诉我什么,但我不知道如何解决这个问题。我已经尝试添加一个类约束,但没有成功。
所以这是我的非常小而简单的程序,它只是计算用户输入了多少有效数字。该程序旨在在用户输入空行时终止。
这只是我以后想在我的项目中使用的辅助功能。
countNumbers :: IO Int
countNumbers = do
x <- count 0
return x where
count :: Int -> IO Int
count n = do
line <- getLine
case line of
"" -> do
return n
_ -> case readMaybe line of
Just _ -> do
x <- count (n+1)
return x
Nothing -> do
x <- count n
return x

不幸的是,我找不到很多关于函数 readMaybe 的信息。我唯一能找到的是在 Haskell 库 Text.Read 中:
readMaybe :: Read a => String -> Maybe aSource
Parse a string using the Read instance. Succeeds if there is exactly one valid result.

对我来说非常奇怪的是,我已经编写了这样一个使用 readMaybe 函数的函数,并且它运行良好......
这个程序只是向用户询问一个数字,只要用户输入一个有效的数字就会一直询问
getLineInt :: IO Int
getLineInt = do
putStrLn "Please enter your guess"
line <- getLine
case readMaybe line of
Just x -> do
return x
Nothing -> do
putStrLn "Invalid number entered"
x <- getLineInt
return x

就我所见,函数 readMaybe 在两个程序中的使用没有区别,因此它在一个程序中有效,但在另一个程序中无效:)

我会非常感谢你的任何提示!

最佳答案

这与 IO 无关,所以可能你不明白编译器试图告诉你什么。有一个类型变量areadMaybe的签名; a必须有 Read例如,但除此之外,它可以是任何东西。编译器告诉你它没有办法确定你想要什么a成为。

getLineInt你没有这个问题,因为你正在返回 readMaybe 的结果并且类型签名说它应该是 Int .在 countNumbers ,您没有使用 readMaybe 的结果,所以没有什么可以用来确定正确的类型。您可以通过添加显式类型签名来解决此问题(我选择了 Int,因为您显然是在数数字):

_ -> case readMaybe line :: Maybe Int of

最后谈谈 do符号:它只是语法糖,你不必一直使用它。而不是 do return x你可以简单地写 return x , 而不是
x <- getLineInt
return x

你可以简单地做
getLineInt

这使事情更具可读性:
getLineInt :: IO Int
getLineInt = do
putStrLn "Please enter your guess"
line <- getLine
case readMaybe line of
Just x -> return x
Nothing -> putStrLn "Invalid number entered" >> getLineInt

关于haskell - IO中如何正确使用readMaybe函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20831012/

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