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.