我刚开始用Haskell编程,为了习惯这种语言的语法和一般风格,我决定尝试解决一些欧拉项目的基本问题。
但是,当我试图在GHC中编译问题1的代码时,收到了一个错误:
main = do
sum :: Int -> Int
sum n
| n == 0 = 0
| n `mod` 3 == 0 = n + sum (n - 1)
| n `mod` 5 == 0 = n + sum (n - 1)
| otherwise = sum (n - 1)
print sum 1000
出现问题的错误消息:
Problem1.hs:5:9: error: parse error on input `|'
|
5 | | n == 0 = 0
| ^
其他遇到这个问题或类似问题的用户通常是在他们的代码中出现了一些简单的语法错误,比如输入了==
而不是=
,或者出现了一个缩进错误,但是我不知道为什么我的代码不能正确编译,我不相信这与缩进有关;我使用的是VSCode,我的制表符大小设置为4个空格,但我也尝试过使用空格手动缩进,这两种方法都产生了相同的错误。
2条答案
按热度按时间p8h8hvxi1#
正如@Caramiriel正确地纠正我的那样,函数不能在do-block中定义,我通过简单地将
sum
从main中取出来解决这个问题,但这在代码中留下了两个问题:1.函数名
sum
是不明确的,因为它既可以引用自动导入的函数Prelude.sum
,也可以引用我创建的函数。为了解决这个问题,我简单地将函数名改为mySum
。print mySum 1000
不编译,因为它等价于print (mySum) 1000
,其中mySum
和1000
都是print
的输入。print (mySum 1000)
还有一个不太重要的问题,我误读了欧拉计划中的原始问题,应该是
print (mySum 999)
,这就给我留下了下面的代码:8wigbo562#
实际上,函数 * 可以 * 在
do
块中定义,但是必须使用let
语句,所以下面的语句可以很好地工作:但是,作为风格问题,在
do
块中定义函数是不常见的,除非它们必须在那里定义(例如,因为它们引用了do
-块中定义的变量),或者它们显然是实用或方便函数,在do
块之外使用没有意义。