2015-10-24 58 views
0

我试图写一个函数,其中给定的两个点(度),大圆距离将被计算。为此,度数必须以弧度改变。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 

回答

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 
+0

我打开如何让它不那么丑陋的建议。但请,没有什么可以想象我只是一个初学者,不会理解太多。 – letter

+0

我认为你的问题(缺少paren)是因为'rad2grad'的巨大定义而开始的。除了获得一个与您的括号相匹配的编辑器外,您还可以将其分解为更小的块,以使其更易于管理。 – crockeea

1

左手侧,其中嵌段必须彼此对齐。因此,对于你缩进问题最小修复看起来是这样的:

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线不是所有的匹配。也许第一个左括号可以删除。

这将处理分析错误;还有其他问题,但我认为你可以自己找到并解决这些问题。

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 
+0

函数如何“知道”它可以将x1 ... y2放入一个?对于愚蠢的问题抱歉:)。现在,在输入4个数字之后,我得到了约束中的非类型变量参数,这是什么意思? – letter

+0

请忽略我的问题的最后部分,发现我的错 – letter

+0

@letter您可以传递任何表达式'grad1d2',包括'x1','y1',以及类似的,但也包括更复杂的东西,比如'x1 + y1/2'和'verletIntegrate f x1 x2'等等。 –