What is the purpose of Unit-returning in functions

Kotlin

Kotlin Problem Overview


From the Kotlin documentation:

If a function does not return any useful value, its return type is Unit. Unit is a type with only one value — Unit.VALUE. This value does not have to be returned explicitly:

fun printHello(name : String?) : Unit { 
   if (name != null) 
     print("Hello, $name!") 
   else 
     print("Hi there!") 
   // We don't need to write 'return Unit.VALUE' or 'return', although we could 
}

What is the purpose of Unit-returning in functions? Why is VALUE there? What is this VALUE?

Kotlin Solutions


Solution 1 - Kotlin

The purpose is the same as C's or Java's void. Only Unit is a proper type, so it can be passed as a generic argument etc.

  1. Why we don't call it "Void": because the word "void" means "nothing", and there's another type, Nothing, that means just "no value at all", i.e. the computation did not complete normally (looped forever or threw an exception). We could not afford the clash of meanings.

  2. Why Unit has a value (i.e. is not the same as Nothing): because generic code can work smoothly then. If you pass Unit for a generic parameter T, the code written for any T will expect an object, and there must be an object, the sole value of Unit.

  3. How to access that value of Unit: since it's a singleton object, just say Unit

Solution 2 - Kotlin

The main reason why Unit exists is because of Generic reasons. Let's use the example from the Kotlin docs.

class Box<T>(t: T) {
    var value = t
}

We can have

var box = Box(Unit)

This is why Unit returns a value so the Kotlin can infer it from the type passed into class initialization. Of course, you could also explicitly write it like this,

var box = Box<Unit>(Unit)

but all the same, it must have a return value. Now, the void keyword in Java in Kotlin is Nothing. Nothing is the last but one type in the type hierarchy in Kotlin with the last one being Nothing? (Nullable Nothing). This does not return any value at all. Because it doesn't return any value at all, we can't pass it as a type in the above code.

var box = Box(Nothing) //This will return an Error

Solution 3 - Kotlin

UNIT actually contains valuable information, it basically just means "DONE". It just returns the information to the caller, that the method has been finished. This is a real piece of information so it can be seen as the return value of a method.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionMajesticRaView Question on Stackoverflow
Solution 1 - KotlinAndrey BreslavView Answer on Stackoverflow
Solution 2 - KotlinAlf MohView Answer on Stackoverflow
Solution 3 - KotlinspyroView Answer on Stackoverflow