为什么在输入`::时出现解析错误

Pat*_*son 1 haskell

我想猜一个数字游戏。

`

main :: IO()

   checkGuess :: (Integral a) => a -> Bool
   checkGuess b = if b == 9 then return True 

main = do
   print "Guess the number?"
   guess <- getLine
   checkGuess guess
Run Code Online (Sandbox Code Playgroud)

但是我在功能checkGuess的输入'::'上得到解析错误

Wil*_*sem 6

这里有几处错误:

  1. 你没有定义的功能直接你写的函数签名之后。因此,您应该首先编写签名,然后编写其绑定,严格来说,这并不是@chi所说的错误,但是强烈建议您这样做;
  2. 在Haskell中,缩进很重要:进入和离开缩进级别表示您开始或结束代码块(例如,where子句);
  3. checkGuess应该返回a Bool,但是通过return True它,您可以返回a Monad m => m Bool;
  4. 哈斯克尔一个if ... then ... else ...没有else确实存在。这是合乎逻辑的,因为函数应始终返回某些内容。
  5. getLine具有as类型IO String,因此guess具有type String,而不是IntInteger因此不能guess直接用于与数字进行比较;和
  6. 正如@Krantz指出的那样,print此处可能应该是putStrLn,因为否则我们将打印字符串文字,而不是字符串内容。

通常,您似乎正在用(纯)函数语言编写命令式程序。快速修复如下:

checkGuess :: (Eq a, Num a) => a -> Bool
checkGuess = (9 ==)

main :: IO()
main = do
   putStrLn "Guess the number?"
   guess <- readLn :: IO Int
   print (checkGuess guess)
Run Code Online (Sandbox Code Playgroud)