```
data InternalTree a = ILeaf
| IBranch a (InternalTree a) (InternalTree a)
deriving Show
takeTree :: Int -> InternalTree a -> InternalTree a
takeTree 0 t = ILeaf
takeTree n ILeaf = ILeaf
takeTree n (IBranch a x y) = IBranch a (takeTree (n-1) x) (takeTree (n-1) y)
takeTreeWhile :: (a -> Bool) -> InternalTree a -> InternalTree a
takeTreeWhile f ILeaf = ILeaf
takeTreeWhile f (IBranch a x y) = if (f a)
then IBranch a (takeTreeWhile f x)
(takeTreeWhile f y)
else ILeaf
```

(Technical error 13 applies to this exercise.)

## One response to “Exercise 7.2”

I think _ should be used when pattern matching the ILeaf cases:

takeTree 0 _ = ILeaf

takeTree _ ILeaf = ILeaf

takeTree n (IBranch x t1 t2) = IBranch x (takeTree (n-1) t1) (takeTree (n-1) t2)

takeTreeWhile _ ILeaf = ILeaf

takeTreeWhile pred (IBranch x t1 t2)

| pred x = IBranch x (takeTreeWhile pred t1)

(takeTreeWhile pred t2)

| otherwise = ILeaf

Also, guard can be used instead of if expression in takeTreeWhile.