Kotlin 1.3 was released recently. There’s a number of interesting changes. Coroutines have graduated from experimental, contracts, and inline classes have been useful in my own work so far. You can read about the changes on the Kotlin website

There’s another feature I find very useful: the new Result type.

I first used the Result Monad in Rust. I don’t write much Rust anymore, but I definitely appreciate the patterns that came from functional programming. With the Result type in Kotlin I can continue to use this to my advantage.

Instead of throwing Exceptions or allowing a null, we can use the Result type to capture the Exception and return a nicely typed object. We can avoid NPEs by using Result, and we get the benefits of static typing when we try to use the object. We can then transform the Result to a new Result using Result.map or Result.fold. We could also perform actions with side effects by using Result.onSuccess. The flexibility is nice and having type safety is a huge win.

One of the limits of the Result at the moment is that you can’t use it practically without enabling a flag. If you try, you’ll get an error like this:

kotlin.Result' cannot be used as a return type

Sad face. Unfortunately there’s not much documentation around how to use this, other than an answer on Stack Overflow.

If you’re using Maven, you can add a compiler flag argument under the configuration:

<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <configuration>
        <jvmTarget>1.8</jvmTarget>
        <args>
            <arg>-Xallow-result-return-type</arg>
        </args>
    </configuration>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>

If you’re using gradle:

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
    kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]


}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
    kotlinOptions.freeCompilerArgs = ["-Xallow-result-return-type"]
}

You should be able to use the Result monad using Kotlin 1.3. A word of warning though: it’s disabled by default because it may change in future versions.