2013-03-27 75 views
1

此代碼在幾分鐘前工作,並且在我重新啓動我的ghci後,它停止工作.. 現在,我在wheresnstsize上收到隨機錯誤。 (不知道我改變了什麼導致每個單獨的錯誤)Haskell語法錯誤在看似隨機的位置

有人可以指出我的語法有什麼問題嗎?

instance Array Tree where 
    new n x 
     | n <= 0 = Leaf 
     | odd n  = Node n nst x nst 
     | even n = Node n (Node (n `div` 2) snst x snst) x snst 
     where nst = (new (n `div` 2) x) 
       snst = (new (n `div` 2 - 1) x) 

    size Leaf   = 0 
    size (Node s _ _ _) = s 

回答

3

一如既往在這些情況下,請確保沒有選項卡隱藏。

我檢查了您的縮進方式where有效。所以除非instance聲明之前有錯誤,否則我看不到任何語法錯誤。

此外,消除錯誤來源的一個想法是移出new的定義。

myNew :: ... 
myNew n x 
     | n <= 0 = Leaf 
     | odd n  = Node n nst x nst 
     | even n = Node n (Node (n `div` 2) snst x snst) x snst 
     where nst = (new (n `div` 2) x) 
       snst = (new (n `div` 2 - 1) x) 

instance Array Tree where 
    new = myNew 

    size Leaf   = 0 
    size (Node s _ _ _) = s 

試試這個,看看是否編譯

+0

這項工作只是罰款。謝謝。但是有沒有解釋爲什麼我這樣做會導致編譯失敗? – rlhh 2013-03-27 03:07:41

+0

@ user1043625好吧。實例中函數定義的語法是有限的。據我記得,你只被允許每個函數有一個方程式。但顯然你在這裏有2個'尺寸'。所以我也很困惑。 – Tarrasch 2013-03-27 04:23:30

+6

@Tarrasch:這不正確。實例聲明中的函數定義沒有這樣的限制。 – 2013-03-27 06:33:29