首页 > 解决方案 > 解析错误(可能不正确的缩进或不匹配的括号) - 主声明的 Haskell 问题

问题描述

这是我的代码

root::(Integer,Integer)->Integer
root guess number   | (guess*guess == number ) =guess
                    | root (guess+number/guess)/2 number
main::IO()
main = {print(root 1,4)}

即使我没有在大括号内提及 print 语句,我也会不断收到解析错误(可能是不正确的缩进或不匹配的括号)。有人可以帮我吗?

标签: haskell

解决方案


首先,您似乎对声明和传递参数有些困惑。

人们通常可以区分两种传递参数的方式(如果你愿意,可以是两种“传统”)——“元组形式”和“柯里化形式”。

前者 - “元组形式” - 将所有参数一起传递到一个元组中:

-- Function declaration
root :: (Integer, Integer) -> Integer
root (guess, number) = ...

-- Calling the function
x = root (1, 4)

元组用括号和逗号分隔。在这里,参数的类型是元组 - (Integer, Integer), - ,形式参数匹配为元组 - (guess, number), - 并且在调用函数时,我将它们作为元组 - 传递(1, 4)。三种情况下的语法相同。

从技术上讲,这个函数只有一个参数,而不是两个。而那个参数是元组类型的。

后者 - “咖喱形式” - 是“一个接一个”地传递参数,可以这么说:

-- Function declaration
root :: Integer -> Integer -> Integer
root guess number = ...

-- Calling the function
x = root 1 4

这里,参数类型分别以柯里化形式 - Integer -> Integer ->, - 声明,参数以柯里化形式 - , - 匹配guess number = ...,并且在调用函数时它们也以柯里化形式 - 传递1 4


但是,在您的代码中,这两种样式似乎混杂在一起:

  • 类型root表示参数是元组的 -(Integer, Integer)
  • 身体root说他们是咖喱 -root guess number
  • 调用站点有点像半元组——有一个逗号,但没有括号。

选择一种风格并在所有三个地方都遵循它。


是体内的两例root畸形。每个案例都必须有一个表格| <condition> = <body>。在您的第一种情况下,您有一个 condition(guess*guess == number)和一个 body guess,但在您的第二种情况下,只有一个部分(没有等号)。

从语义上,我冒昧地猜测您的第二种情况是“否则”-即,如果第一种情况的条件不匹配,则应该对其进行评估。

如果这是正确的,只需添加otherwise条件:

                | (guess*guess == number) = guess
                | otherwise = root (guess+number/guess)/2 number

推荐阅读