Functional Typelevel Programming in Scala