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...