Partial functions
A partial function (not to be confused with partial applied function) is a function that is not defined for every possible value of its parameter type. In contrast, a total function is a function that is defined for every possible value.
Let's have a look at the following example:
fun main(args: Array<String>) {
val upper: (String?) -> String = { s:String? -> s!!.toUpperCase()} //Partial function, it can't transform null
listOf("one", "two", null, "four").map(upper).forEach(::println) //NPE
}The upper function is a partial function; it can't process a null value despite the fact that null is a valid String? value. If you try to run this code, it will throw a NullPointerException (NPE).
Arrow provides an explicit type PartialFunction<T, R> for partial functions of type (T) -> R:
import arrow.core.PartialFunction
fun main(args: Array<String>) {
val upper: (String?) -> String = { s: String? -> s!!.toUpperCase() } //Partial function, it...