删除所有Empty的Haskell

时间:2014-02-08 15:53:42

标签: haskell tree fork case

考虑以下类型来表示树:

data Tree a =Empty
            |Leaf a
            |Fork (Tree a) (Tree a)

我需要帮助定义从非空树中删除所有空的函数clean :: Tree a -> Tree a。当树中没有元素时,该函数应返回Empty。

注意:可能的树是Fork Empty Empty

这是我到目前为止所尝试的内容,但我不知道它是否适用于上述情况:

clean :: Tree a -> Tree a
clean Leaf x = Leaf x
clean Fork Empty r = r  
clean Fork l Empty = r  
clean Fork l r =  aux l r --If both left and right are empty, I can't fork.


aux :: Tree a -> Tree a -> Tree a
aux l r = if (clean l)==Empty && (clean r)==Empty
          then Empty  else Fork (clean l) (clean r)  --I am not sure about this case?

我应该包括案例清洁叉空空=空吗? 这没有多大意义,因为我想删除整个Fork而不是放空

1 个答案:

答案 0 :(得分:1)

我认为这应该有用(我现在不能尝试):

clean :: Tree a -> Tree a
clean (Fork l r) = f (clean l) (clean r) where
   f Empty r = r
   f l Empty = l
   f l r = Fork l r
clean x = x