我正在处理以下代码,并希望在框字符串中找到该数字的索引。所以我使用了findIndex,但它返回了Maybe Int值,而我只想要Int值。
我如何将Maybe Int转换为Int值,或者有什么方法可以从Maybe Int中提取Int。如果Maybe Int不是
,代码应该打印错误消息box:: String
box = unlines $ ["0 | 1 | 2",
"---------",
"3 | 4 | 5",
"---------",
"6 | 7 | 8"]
moves = do
putStrLn " Enter the number"
number <- readLn :: IO Int
print number
findpostion number box
findposition number box = findIndex (==number) box
答案 0 :(得分:17)
您可以使用do
声明中的模式匹配轻松完成此操作:
case findposition number box of
Just n -> -- do whatever with n
Nothing -> putStrLn "Invalid number!" -- you can handle the error however you want.
一个好的选择是创建一个单独的IO动作来获取数字:
getNumber = do putStrLn "Enter the number:"
number <- readLn
case findposition number box of
Just n -> -- Do whatever
Nothing -> putStrLn "Please try again." >> getNumber
这样,如果用户输入的号码无效,则只需再次询问。
此外,正如现在所写,您的代码将无法正常工作。您应该使用其他方式将数字存储在box
中作为实际数字;现在,他们在弦乐队。
答案 1 :(得分:11)
显然,一般情况下不可能:当搜索没有成功时,没有规范的整数返回值,所以你得到的Nothing
没有任何这样的值。
如果你真的不关心Nothing
案例(例如因为你总会确保有一个这样的元素),你可以使用fromJust
中的Data.Maybe
函数,你也可以快速实现自己:
findposition number = (\(Just i)->i) . findIndex (==number)
然而,这并不值得推荐,因为将需要确保不会破坏,并且通过正确的模式匹配更容易实现这一点。