Type-oriented programming/Functors

A functor is a type operator equipped with a map method declared as follows:

type Functor[T] {
  func map[U](f Func[T,U]) Self[U]

The map method must satisfy some formal requirements that we ignore here for now. The important point is that map takes a function of type Func[T,U] (where U is a type argument of the method) and returns an instance of type Self[U], that is, the same functor possibly with a different type argument. You’ve already met the Maybe functor:

type Maybe[T] : Functor[T] {
  property val T

  func map[U](f Func[T,U]) Self[U] {
    return new Self[U] {
      val = self.val.isNil() ? nil : f(self.val)

  func description() String {
    return self.val.isNil() ? "none" : self.val.description()

In the next section, we’ll use Maybe to explain what a monad is and how a generic Monad type can be implemented.

NB: The pseudocode can be tried out using the Funcy app, which can be downloaded for free from Apple’s App Store (iOS/macOS), Google Play (Android) or Amazon Appstore. The code to be executed must be placed in a main {} block.