Create upwards compatible APIs

This topic has been covered by Elm Patterns
Problem
Solution
Movie.elm
type Movie =
Movie
{ title : String
, rating : Int
, -- adding a field will destroy the function below
}
new : String -> Int -> Movie
new title rating =
Movie
{ title = title
, rating = clamp 1 5 rating
}
Movie.elm
type Movie =
Movie
{ title : String
, rating : Int
, director : Maybe String
}
fromTitle : String -> Movie -> Movie
fromTitle title =
Movie
{ title : title
, rating : 0
, director : Nothing
}
withRating : Int -> Movie -> Movie
withRating rating (Movie movie) =
{ movie | rating = clamp 1 5 rating }
withDirector : String -> Movie -> Movie
withDirector director (Movie movie) =
{ movie | director = director }

Question

How can I define my type, such that I can add features without breaking the API?

Answer

First write a constructor fromTitle that only uses as few arguments as possible. Next add partial constructors for every feature of your type: withRating and withDirector.
Now creating a new Movie can be done like this:
Movie.fromTitle "Life of Brian"
|> Movie.withDirector "Terry Jones"
|> Movie.withRating 5

Further Reading