2017-02-19 76 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"