Haskell 为什么输入“:”时出现解析错误

Haskell 为什么输入“:”时出现解析错误,haskell,Haskell,我在猜数字游戏 ` 但是我在函数checkGuess中得到了输入“::”的解析错误这里有几个错误: 在编写函数的签名后,不能直接定义函数。因此,您应该先写签名,然后再写其绑定,严格来说,这不是一个错误,但强烈建议您这样做; 在Haskell中,缩进很重要:输入和离开缩进级别表示开始或结束代码块,例如where子句; 你的checkGuess应该返回一个Bool,但是如果返回True,你就把它变成一个Monad m=>m Bool; 在哈斯凯尔,如果。。。然后其他的如果没有其他人,就不存在其他人。

我在猜数字游戏

`


但是我在函数checkGuess中得到了输入“::”的解析错误这里有几个错误:

在编写函数的签名后,不能直接定义函数。因此,您应该先写签名,然后再写其绑定,严格来说,这不是一个错误,但强烈建议您这样做; 在Haskell中,缩进很重要:输入和离开缩进级别表示开始或结束代码块,例如where子句; 你的checkGuess应该返回一个Bool,但是如果返回True,你就把它变成一个Monad m=>m Bool; 在哈斯凯尔,如果。。。然后其他的如果没有其他人,就不存在其他人。这是合乎逻辑的,因为函数应该总是返回一些东西; getLine具有as类型IO字符串,因此guess具有类型String,而不是Int、Integer,因此不能直接使用guess与数字进行比较;和 正如所指出的,这里的打印可能应该是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)

这里有几件事是错误的:

在编写函数的签名后,不能直接定义函数。因此,您应该先写签名,然后再写其绑定,严格来说,这不是一个错误,但强烈建议您这样做; 在Haskell中,缩进很重要:输入和离开缩进级别表示开始或结束代码块,例如where子句; 你的checkGuess应该返回一个Bool,但是如果返回True,你就把它变成一个Monad m=>m Bool; 在哈斯凯尔,如果。。。然后其他的如果没有其他人,就不存在其他人。这是合乎逻辑的,因为函数应该总是返回一些东西; getLine具有as类型IO字符串,因此guess具有类型String,而不是Int、Integer,因此不能直接使用guess与数字进行比较;和 正如所指出的,这里的打印可能应该是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)

可能是因为压痕?压痕在哪里?如果我不缩进checkGuess,我会得到解析错误,可能是不正确的缩进或不匹配的括号。不仅缩进混乱,函数体上方还有main floating way的类型签名,中间有一个完全不同的函数。我不知道你想用它实现什么。另外,if表达式缺少else子句,返回值肯定是错误的,并且在主函数的最后一行中至少有2个类型错误。@PatrikGustafsson:请不要只是缩进以消除一个错误,因为很可能会像这里一样弹出另一个错误。由于缩进,可能?缩进在哪里?如果我不缩进checkGuess,我会得到解析错误,可能是不正确的缩进或不匹配的括号。不仅缩进混乱,函数体上方还有main floating way的类型签名,中间有一个完全不同的函数。我不知道你想用它实现什么。另外,if表达式缺少else子句,返回值肯定是错误的,并且在主函数的最后一行中至少有2个类型错误。@PatrikGustafsson:请不要为了消除一个错误而缩进,因为这样可能会弹出另一个错误。谢谢!我需要考虑的很多:学究:从技术上讲,1不是一个错误,但它仍然是非常推荐的。我们是否也应该将第一个打印更改为putStr或putstrn?我相信print::Show a=>a->IO不是故意的。谢谢!我需要考虑的很多:学究:从技术上讲,1不是一个错误,但它仍然是非常推荐的。我们是否也应该将第一个打印更改为putStr或putstrn?我相信print::Show a=>a->IO不是故意的。