在Haskell中将Maybe Int转换为Int

时间:2012-01-18 04:40:35

标签: haskell

我正在处理以下代码,并希望在框字符串中找到该数字的索引。所以我使用了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

2 个答案:

答案 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)

然而,这并不值得推荐,因为需要确保不会破坏,并且通过正确的模式匹配更容易实现这一点。