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