我在 Haskell 中编写了一个简单的程序,可以玩The Rust Programming Language book 中描述的猜谜游戏:
它是这样工作的:程序将生成一个介于 1 和 100 之间的随机整数。然后它会提示玩家输入猜测。输入猜测值后,会提示猜测值是过低还是过高。如果猜对了,游戏将打印祝贺并退出。
这是我写的:
import Control.Monad (when)
import System.Random (randomRIO)
-- | Check if the guess is correct, otherwise provide a hint
respond :: Int -> Int -> String
respond correct guess
| guess > correct = "Smaller than " ++ show guess
| guess < correct = "Larger than " ++ show guess
| guess == correct = "Correct! " ++ show correct
-- | Main game loop; prompt for input and repeat until guessed correctly
play :: Int -> IO ()
play x = do
putStr "Guess: "
guess <- read <$> getLine
putStrLn $ respond x guess
when (guess /= x) $ play x
-- | Start the game with a random number between 1 and 100
main :: IO ()
main = play =<< randomRIO (1, 100)
该代码有效,但 GHC 给了我一个警告,"Pattern match(es) are non exhaustive. In an equation for 'respond': Patterns not matched: _ _"
我用这两个下划线来表示Ints
我作为函数参数的两个respond
。我不明白的是我没有涵盖哪种情况。那些不是Maybe Int
s 或任何特殊的东西——该函数需要两个 valid Ints
,所以我只需要处理整数——而且我认为没有任何数字不能被视为大于、小于或等于另一个?
这只是 GHC 假设我没有涵盖所有情况,因为我没有添加最后的otherwise =
后卫吗?即使它在逻辑上涵盖了所有情况。
另外,如果您对如何编写更惯用的 Haskell 有任何提示,我将不胜感激。我还在学习基础知识。