Elm exercise solutions

This post contains the solutions to exercises which could be found on Elm’s official page for version 0.15. Solutions are written for Elm 0.15.1.

1. Sum all of the elements of a tree.

sum : Tree Int -> Int
sum tree =
  case tree of
    Empty -> 0
    Node value left right ->
      value + (sum left) + (sum right)

2. Flatten a tree into a list.

Using List.append

import List exposing (append)
flatten : Tree a -> List a
flatten tree =
  case tree of
    Empty -> []
    Node value left right ->
      value :: append (flatten left) (flatten right)

Using List.concat

import List exposing (concat)
flatten : Tree a -> List a
flatten tree =
  case tree of
    Empty -> []
    Node value left right ->
      concat [ [value], flatten left, flatten right ]

3. Check to see if an element is in a given tree.

isElement : a -> Tree a -> Bool
isElement element tree =
  case tree of
    Empty -> False
    Node value left right ->
      if | value == element -> True
         | otherwise -> (isElement element left || isElement element right)

Instead of otherwise you could also write:

if | value == element -> True
   | value /= element -> (isElement element left || isElement element right)

Make sure to call it like this: display "isElement" (isElement 2) t2

4. Check to see if an element is in a given tree.

fold : (a -> b -> b) -> b -> Tree a -> b
fold func initialValue tree =
  case tree of
    Empty -> initialValue
    Node value left right ->
      func value (fold func (fold func initialValue right) left)

Alternative using local variables

fold : (a -> b -> b) -> b -> Tree a -> b
fold func initialValue tree =
  case tree of
    Empty -> initialValue
    Node value left right ->
      let sum = fold func rightSum left
          rightSum = fold func initialValue right
      in
        func value sum