Source: http://www.cs.columbia.edu/~sedwards/classes/2016/4115-summer/lrms/Scala--.pdf