Functional Error Management in Kotlin: An Introduction to Arrow-Kt Either Data Type

Arrow.Kt is a functional programming library for Kotlin that provides a powerful set of abstractions for working with functional data types. One of these abstractions is the Either data type, which is a way to represent values that can be one of two possible types.

Anand Verma
4 min readJan 18

--

Either Data Type, if Left means exception and right for result
Either<Exception,Result> Left is for exception and result always right

The Either data type is a way to represent a computation that can either succeed or fail. It is similar to the Option data type in that it represents the absence of a value, but it also includes an additional case to represent a failure. The Either data type is defined as follows:

sealed class Either<out L, out R> {
data class Left<out L>(val value: L) : Either<L, Nothing>()
data class Right<out R>(val value: R) : Either<Nothing, R>()
}

The Either data type has two subclasses, Left and Right, which represent the success and failure cases, respectively. The Left case is used to represent a failure, and it contains a value of the type specified by the L parameter. The Right case is used to represent a success, and it contains a value of the type specified by the R parameter.

To implement Arrow Kt in your project, you can add the following dependency to your build.gradle file:

dependencies {
implementation "io.arrow-kt:arrow-core:$arrow_version"
}

For detailed information on how to implement Arrow.Kt in your project and latest version be sure to check out the Arrow.Kt website and documentation.

Here are a few examples of how you might use the Either data type in your code, let’s take an example of using the Either data type to handle the result of a network request:

// Step 1: Define a function that returns an Either
fun getDataFromServer(url: String): Either<IOException, String> {
return try {
val response = URL(url).readText()
Either.Right(response)
} catch (e: IOException) {
Either.Left(e)
}
}

// Step 2: Call the function and store the result in a variable
val result = getDataFromServer("https://example.com")
// result is of type Either<IOException, String>

// Step 3: Use the map function to transform the result
val processedData = result.map { it.split(",") }
// processedData is of type Either<IOException, List<String>>

// Step 4: Use the fold function to handle the success and failure cases
val finalResult = processedData.fold(
{ "Error: ${it.message}" },
{ "Data: $it" }
)
// finalResult is of type String

In this example, we’re using the Either data type to handle the result of a network request. The getDataFromServer function returns an Either<IOException, String>, where the Left case contains an IOException if the request fails, and the Right case contains the response from the server as a String. We're then using the map function to transform the response into a list of strings, and the fold function to handle the success and failure cases.

You can also use the when case on the Either class to handle the different cases in a more elegant way

val result = getDataFromServer("https://example.com")

when(result) {
is Either.Left -> println("Error: ${result.a}")
is Either.Right -> println("Data: ${result.b}")
}

In this example, we’re using the when case to check the type of the result variable, and handle the Left and Right cases separately.

Another example is when you’re performing multiple operations and you want to stop the execution when one of the operations fails, in this case, you can use the Either data type to handle the failure and success cases separately, and stop the execution when one of the operations fails.

fun validateForm(form: Form): Either<String, Form> {
val usernameError = validateUsername(form.username)
if (usernameError != null)
return Either.Left(usernameError)

val emailError = validateEmail(form.email)
if (emailError != null)
return Either.Left(emailError)

val passwordError = validatePassword(form.password)
if (passwordError != null)
return Either.Left(passwordError)
return Either.Right(form)
}

In this example, we’re validating a form and we’re returning Either.Left with an error message if one of the validation fails, otherwise, we're returning Either.Right with the form data.

Start using the Either data type to handle the success and failure cases of your computations in a more elegant and functional way. The Either class provides a lot of utility functions such as map, flatMap, fold, getOrElse, swap, isLeft, isRight and many more to handle or transform the result. It is a powerful tool that can make your code more robust and maintainable.

Stay tuned for our upcoming post where we will be exploring the Validated data type in depth. The Validated data type is another powerful data type provided by Arrow Kt, it allows you to accumulate errors and handle them in a more elegant way, it's a great tool to use when you have to validate multiple fields or inputs. We'll be showing you how to use it in your code and how it can make your code more robust and maintainable.

Check out our previous post for a brief overview of Arrow Kt, a functional programming library for Kotlin. Understanding the basics of Arrow Kt will help you make the most of the powerful data types it provides like Either, Option, NonEmptyList, Validated and Ior. Get a head start before exploring the details of the Validated data type in our upcoming post.

Appreciate the read? Give it a clap, hit that follow button, leave a comment, Let’s grow together.

--

--

Anand Verma

Discover the magic of mobile app development through the eyes of a tech-enthusiast and never-ending learner.