Haskell -输入分析错误'|“全球卫生中心

7vhp5slm  于 2022-12-27  发布在  其他
关注(0)|答案(2)|浏览(166)

我刚开始用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个空格,但我也尝试过使用空格手动缩进,这两种方法都产生了相同的错误。

p8h8hvxi

p8h8hvxi1#

正如@Caramiriel正确地纠正我的那样,函数不能在do-block中定义,我通过简单地将sum从main中取出来解决这个问题,但这在代码中留下了两个问题:
1.函数名sum是不明确的,因为它既可以引用自动导入的函数Prelude.sum,也可以引用我创建的函数。为了解决这个问题,我简单地将函数名改为mySum

  1. print mySum 1000不编译,因为它等价于print (mySum) 1000,其中mySum1000都是print的输入。print (mySum 1000)
    还有一个不太重要的问题,我误读了欧拉计划中的原始问题,应该是print (mySum 999),这就给我留下了下面的代码:
mySum :: Int -> Int
mySum n
    | n == 0         = 0
    | n `mod` 3 == 0 = n + mySum (n - 1)
    | n `mod` 5 == 0 = n + mySum (n - 1)
    | otherwise      = mySum (n - 1)

main = do
    print (mySum 999)
8wigbo56

8wigbo562#

实际上,函数 * 可以 * 在do块中定义,但是必须使用let语句,所以下面的语句可以很好地工作:

main = do
    let 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

但是,作为风格问题,在do块中定义函数是不常见的,除非它们必须在那里定义(例如,因为它们引用了do-块中定义的变量),或者它们显然是实用或方便函数,在do块之外使用没有意义。

相关问题