Implementing a functional list
With everything that we've learned in the first two chapters, we can implement a pure functional list:
sealed class FunList<out T> { object Nil : FunList<Nothing>() data class Cons<out T>(val head: T, val tail: FunList<T>) : FunList<T>() }
The FunList
class is a sealed class; just two possible subclasses exist—Nil
, an empty list (in other books you can see this defined as Null
or Empty
) and Cons
(a construct, name inherited from Lisp, that holds two values).
The T
type is marked out
; this is for variance, which we'll cover variance in future chapters.
Nil
is an object (we don't need different instances of Nil
) extending FunList<Nothing>
(remember that Nothing
is the bottom of Kotlin's type hierarchy).
The Cons
value contains two values—head
, a single T
, and tail
, a FunList<T>
; therefore, it can be a Nil
value or another Cons
.
Let's create a list instance as follows:
import com.packtpub.functionalkotlin.chapter02.FunList...