我尝试编写一个函数,给定两个点(度数),将计算大圆距离。为此,必须以弧度改变学位。
旁边的代码看起来很丑陋,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
答案 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