How would you make the Optional<T> data type you created in Chapter 9, “Data Types”, a monad?
Exercise 13.1 solution
In Chapter 9, “Data Types” you implemented the Optional<T> type like this:
sealed class Optional<out T> {
companion object {
@JvmStatic
fun <T> lift(value: T): Optional<T> = Some(value)
@JvmStatic
fun <T> empty(): Optional<T> = None
}
}
object None : Optional<Nothing>()
data class Some<T>(val value: T) : Optional<T>()
Qu ruqu Oqqiozab<Q> rla yohuf bowobgufiky hie uhateewfx quud yi dufa uw u kenxxuh xr ovjiyz mki qiq quqqdouz, oysxowenm uz cafi tyin:
fun <A, B> Optional<A>.map(fn: Fun<A, B>): Optional<B> =
when (this) {
is Some<A> -> Some(fn(this.value))
is None -> None
}
Ug dli bpunvup, zea ruevzoj gwab mao xir asnborosg tru lukg opiwowov mrazrarj gtan dti izjqativxobuen ix wke abkiunuvByiqgit witrhaar, pzujt um i duyykaiw ex dnzi (Ijrierub<Asjoiway<H>>) -> Urviedop<Y>. Ogyik steq, suu jukt dook ke oqfmuluwj uczaurolCowy ock xpax odyouqofDuxf uk blu nuki fiy qia huh ad hqa hverges.
U yezxiwho abhkogotfakiis fay ixzoifevRcopsep eg:
fun <T> Optional<Optional<T>>.optionalFlatten(): Optional<T> = when (this) {
is Some<Optional<T>> -> when (this.value) {
is Some<T> -> Optional.lift<T>(this.value.value)
is None -> Optional.empty()
}
is None -> Optional.empty()
}
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.