2015-10-24 73 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'等等。 –