haskell - 解析错误(可能不正确的缩进或不匹配的括号) - 主声明的 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 语句,我也会不断收到解析错误(可能是不正确的缩进或不匹配的括号)。有人可以帮我吗?
解决方案
首先,您似乎对声明和传递参数有些困惑。
人们通常可以区分两种传递参数的方式(如果你愿意,可以是两种“传统”)——“元组形式”和“柯里化形式”。
前者 - “元组形式” - 将所有参数一起传递到一个元组中:
-- 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