Either / Option in Kotlin

In some functional languages, such as Scala, Either and Option is provided. Either represents what type of exception a function may throws and what type of value the function returns in success cases. Option represents absence of a value instead of nullable.

Either / Option in Kotlin

Since Kotlin do not provide Either or Option (at least for version 1.5), we have to use third-patry library to introduce Either or Option. The most realistic option at this moment is using Arrow. Arrow is “Functional companion to Kotlin’s Standard Library”.

I also re-implemented Either and Option in Kotlin. The code is published as a library so you can use it. It’s completely a hobby project, so be care to use it in production :)

Either

Either has subtypes of Left and Right. Left represents an exception. Right represents success cases and has a value. It goes something like this.

sealed class Either<out E : Throwable, out T : Any> {
  data class Left<out E : Throwable>(val error: E) : Either<E, Nothing>()
  data class Right<out T : Any>(val value: T) : Either<Nothing, T>()
}

For example, if a function returns a value or throws an exception, the returned value could be lifted to Either. Requesting via Web API is the typical case.

suspend fun getAwesomeValue(): Either<AwesomeException, AwesomeValue> {
  val response = apiClient.getAwesomeResponse()
  return if (response.isSuccessful) {
    Either.Right(value = requireNotNull(response.body()))
  } else {
    Either.Left(error = AwesomeException())
  }
}

On the side receiving the Either, when could be used instead of pattern matching since Kotlin does not provide pattern matching (at least for version 1.5).

when (it) {
  is Either.Left -> {
    // do something here
  }
  is Either.Right -> {
    // do something here
  }
}

Option

Option has subtypes of Some and None. Some represents that Option has a value. None represents that Option does not have any value.

sealed class Option<out T : Any> {
  data class Some<out T : Any>(val value: T) : Option<T>()
  object None : Option<Nothing>()
}

Nullable could be replaced with Option. Like Either, when could be used for Option value also.

References

About me

Experienced software developer. Technical lead at Fuller, Inc. My speciality is developing Android native app. I'm living in Tsukuba Japan, with my family, dogs, and cats :)

Here is more detailed profile.