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

时间:2019-09-02 18:55:26

标签: 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

但是在函数checkGuess上输入'::'时出现解析错误

1 个答案:

答案 0 :(得分:6)

这里有几处错误:

  1. 在编写函数签名后,您不能直接定义函数 。因此,您应该首先写出签名,然后然后写出其绑定,严格来说,这不是@chi says的错误,但是强烈建议您这样做;
  2. 在Haskell中,缩进很重要:进入和离开缩进级别表示您开始或结束代码块,例如where子句;
  3. 您的checkGuess应该返回一个Bool,但是使用return True时,您将其设为Monad m => m Bool;
  4. 在Haskell中,没有if ... then ... else ...的{​​{1}} 存在。这是合乎逻辑的,因为函数应始终返回某些内容;
  5. else的类型为getLine,因此IO String的类型为guess,而不是StringInt,因此您不能使用{ {1}}直接与数字进行比较;和
  6. 正如@Krantz所指出的,此处的Integer应该是guess,因为否则我们将打印字符串文字,而不是字符串内容。

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

print