2017-02-19 75 views
0

我是Haskell的新手,目前正在處理樹。在這裏,我想創建一個函數,將樹中的元素交換,直到它變成一個maxheap。這樣,我會使用Heapsort算法。maxheap函數解析錯誤

data Bintree a = E | Tree (Bintree a) a (Bintree a) deriving(Eq, Ord, Show) 

swaptree:: Bintree Int -> Bintree Int 
swaptree (Tree E w E) = (Tree E w E) 
swaptree (Tree E w (Tree lr x rr))|((max w x)==w)=(Tree E w (Tree lr x rr)) 
           |((max w x)==x)=(Tree E x(swaptree(Tree lr w rr))) 
           |otherwise error "something went wrong or program is bad" 
swaptree (Tree (Tree ll v rl) w E)|((max v w)==w)=(Tree (Tree ll v rl) w E) 
           |((max v w)==v)=(Tree (swaptree(Tree ll w rl)) v E) 
           |otherwise error "something went wrong or program is bad" 
swaptree (Tree (Tree ll v rl) w (Tree lr x rr))|((max3 v w x)==w) = (Tree (Tree ll v rl) w (Tree lr x rr)) 
              |((max v x)==x)=(Tree (Tree ll v rl) x (swaptree(Tree lr w rr))) 
              |((max v x)==v)=(Tree(swaptree(Tree ll w rl)) v (Tree lr x rr)) 
              |otherwise error "something went wrong or program is bad" 
swaptree':: Bintree Int -> Bintree Int 
swaptree' (Tree E w E) = (Tree E w E) 
swaptree' (Tree lub w rub) = (swaptree(Tree(swaptree lub) w (swaptree rub))) 

這就產生了我這個錯誤:

8:1: error:parse error (possibly incorrect indentation or mismatched brackets) 

現在,我看它和閱讀,這通常發生,leSt使用沒有in,但因爲我沒有使用它,我有不知道如何解決這個問題。 我將不勝感激關於如何改進我的代碼的任何幫助或提示! PS:請對我施以憐憫。正如我所說的,我現在對Haskell很不好。

回答

1

錯誤已經由鋰姚夏發現,並建議修復。

請注意,您也可以使用這種風格拆除違規行:

swaptree (Tree E w (Tree lr x rr)) | x <= w = Tree E w (Tree lr x rr) 
            | otherwise = Tree E x (swaptree (Tree lr w rr)) 
-- etc. 

事實上,這是不可思議檢查案件max x w == xmax x w == wotherwise。如果我們確實達到了「否則」,max的定義確實是錯誤的。我們可以放心地忽略這種情況。

+0

您的解決方案好得多! –

1
|otherwise error "something went wrong or program is bad" 

應該

|otherwise = error "something went wrong or program is bad"