解析haskell中的结构错误

时间:2015-10-24 17:03:01

标签: haskell

我尝试编写一个函数,给定两个点(度数),将计算大圆距离。为此,必须以弧度改变学位。

旁边的代码看起来很丑陋,ghci在输入'rad2grad'上给我一个解析错误 我做错了什么?

gke  (x1, y1)(x2, y2) = c*rad2grad
                                  where 
                                              c = 111.2225685
                                       rad2grad = (360*arcos ((sin(grad2rad x1)*sin(grad2rad x2) + cos(grad2rad x1)*cos(grad2rad x2)*cos(grad2rad y1 - grad2rad y2)))/(2*pi)
                                    grad2rad x1 = (2*pi/360)*x1
                                    grad2rad x2 = (2*pi/360)*x2
                                    grad2rad y1 = (2*pi/360)*y1
                                    grad2rad y2 = (2*pi/360)*y2

3 个答案:

答案 0 :(得分:2)

Haskell对空白敏感,因此对齐非常重要。一旦对齐,GHCi说,

parse error (possibly incorrect indentation or mismatched brackets)

哪个应该向您表明您可能有不匹配的括号(假设您的缩进是正确的)。在除以(2*pi)之前,你确实错过了最后的结束语。

以下编译:

gke  (x1, y1)(x2, y2) = c*rad2grad
  where 
    c = 111.2225685
    rad2grad = (360*arcos ((sin(grad2rad x1)*sin(grad2rad x2) + cos(grad2rad x1)*cos(grad2rad x2)*cos(grad2rad y1 - grad2rad y2))))/(2*pi)
    grad2rad x1 = (2*pi/360)*x1
    grad2rad x2 = (2*pi/360)*x2
    grad2rad y1 = (2*pi/360)*y1
    grad2rad y2 = (2*pi/360)*y2

答案 1 :(得分:1)

where块中方程式的左侧必须彼此对齐。因此,对缩进问题的最小修复如下所示:

gke  (x1, y1)(x2, y2) = c*rad2grad
                              where 
                                c           = 111.2225685
                                rad2grad    = (360*arcos ((sin(grad2rad x1)*sin(grad2rad x2) + cos(grad2rad x1)*cos(grad2rad x2)*cos(grad2rad y1 - grad2rad y2)))/(2*pi)
                                grad2rad x1 = (2*pi/360)*x1
                                grad2rad x2 = (2*pi/360)*x2
                                grad2rad y1 = (2*pi/360)*y1
                                grad2rad y2 = (2*pi/360)*y2

此外,rad2grad行上的括号并非全部匹配。也许可以删除第一个左括号。

这将解决解析错误;还有其他问题,但我认为你可以自己找到并修复它们。

答案 2 :(得分:1)

您正在为grad2rad提供冗余定义 - 它们将被忽略。您可以编写如下函数:

gke  (x1, y1)(x2, y2) = c*rad2grad
                          where 
                            c           = 111.2225685
                            rad2grad    = (360*acos ((sin(grad2rad x1)*sin(grad2rad x2) + cos(grad2rad x1)*cos(grad2rad x2)*cos(grad2rad y1 - grad2rad y2)))/(2*pi))
                            grad2rad a = (2*pi/360)*a