如何在Haskell的case语句中使用乘法行?

um6iljoc  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(169)

我是第一次用Haskell编码,我在case语句方面遇到了麻烦。

points = do
  pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
  case pts of
    Left ex -> putStrLn "Please enter a number."
    Right val -> return pts

这段代码用于从用户输入中阅读一个整数,并进行检查以确保它确实是一个整数。我遇到的问题是Left ex的情况。我想做的是,如果出现异常,打印"Please enter a number."行,然后再次运行points函数。问题是我不知道如何在Left ex的情况下调用points。因为它会干扰书面声明,有什么建议吗

hgb9j2n6

hgb9j2n61#

你可以使用do表示法,它允许将几个IO(或另一个单子的)动作按顺序粘合在一起,就像你已经在points本身的主体中所做的那样:

points = do
  pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
  case pts of
    Left ex -> do
      putStrLn "Please enter a number."
      points
    Right val -> return pts

或者,您可以执行do表示法的基本操作,并使用>>=操作符,该操作符将两个IO操作按顺序粘合在一起:

points = do
  pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
  case pts of
    Left ex -> putStrLn "Please enter a number." >>= \_ -> points
    Right val -> return pts

注意,\_ ->位忽略了第一个操作的返回值,所以你可以使用>>操作符,它的作用和>>=一样,但是它会丢弃第一个操作的结果:

points = do
  pts <- try(readLn :: IO Int) :: IO (Either SomeException Int)
  case pts of
    Left ex -> putStrLn "Please enter a number." >> points
    Right val -> return pts

相关问题