What if one function could hand you another function ready to solve your problem instantly?
Why Returning functions from functions in Kotlin? - Purpose & Use Cases
Imagine you want to create different calculators for adding, subtracting, or multiplying numbers. Without returning functions, you'd have to write separate code for each calculator and call them manually every time.
This manual way means repeating similar code again and again. It's slow to write, easy to make mistakes, and hard to change later if you want a new calculator type.
By returning functions from functions, you can create a flexible calculator maker. One function can give you back the exact calculator you want, ready to use. This saves time, reduces errors, and makes your code neat and easy to update.
fun add(a: Int, b: Int) = a + b fun subtract(a: Int, b: Int) = a - b // Call add(5,3) or subtract(5,3) manually
fun getCalculator(op: String): (Int, Int) -> Int = when(op) {
"add" -> { a, b -> a + b }
"subtract" -> { a, b -> a - b }
else -> { _, _ -> 0 }
}
// val calc = getCalculator("add")
// calc(5,3)This lets you build smart, reusable tools that create other tools on demand, making your programs powerful and flexible.
Think of a coffee machine that can make espresso, latte, or cappuccino. Instead of building a new machine for each, you have one machine that returns the right coffee maker function based on your choice.
Manual repetition is slow and error-prone.
Returning functions creates flexible, reusable code.
It helps build smart tools that adapt to different needs.
Practice
Solution
Step 1: Understand function return types
In Kotlin, a function can return any type, including another function type.Step 2: Interpret returning a function
Returning a function means the outer function gives back a function that can be stored or called later.Final Answer:
The outer function produces a function as its result that can be called later. -> Option CQuick Check:
Returning a function means output is a callable function [OK]
- Thinking only primitive types can be returned
- Assuming returned function must be called immediately
- Believing returned functions cannot have parameters
Solution
Step 1: Check function return type syntax
In Kotlin, a function returning another function uses syntax like: fun name(): (ParamType) -> ReturnTypeStep 2: Verify the return statement
The function returns a lambda matching (Int) -> String, e.g., { i -> i.toString() }Final Answer:
fun outer(): (Int) -> String { return { i -> i.toString() } } -> Option BQuick Check:
Correct function type syntax = fun outer(): (Int) -> String { return { i -> i.toString() } } [OK]
- Using arrow -> incorrectly in return type
- Mixing return type syntax with function body
- Omitting parentheses around function type
fun makeMultiplier(x: Int): (Int) -> Int {
return { y -> x * y }
}
fun main() {
val multiplyBy3 = makeMultiplier(3)
println(multiplyBy3(5))
}Solution
Step 1: Understand makeMultiplier function
makeMultiplier returns a function that multiplies its input by x (captured from outer function).Step 2: Trace main function calls
multiplyBy3 is a function multiplying by 3; multiplyBy3(5) = 3 * 5 = 15.Final Answer:
15 -> Option DQuick Check:
3 * 5 = 15 [OK]
- Confusing parameter names
- Forgetting the closure captures x
- Expecting immediate multiplication without calling returned function
fun outer(): (Int) -> Int {
val inner = { x: Int -> x * 2 }
return inner()
}Solution
Step 1: Analyze return statement
inner is a lambda function; inner() calls it and returns Int, not a function.Step 2: Correct return value
To return the function itself, return inner without parentheses.Final Answer:
Calling inner() instead of returning the function itself -> Option AQuick Check:
Return function, not function call [OK]
- Returning function call instead of function
- Omitting function return type
- Misunderstanding lambda syntax
fun createCounter(start: Int): () -> Int {
var count = start
return {
count += 1
count
}
}
fun main() {
val counter = createCounter(10)
println(counter())
println(counter())
}Solution
Step 1: Understand closure capturing variable
The returned lambda captures 'count' variable and increments it each call.Step 2: Trace calls to counter()
First call: count = 10 + 1 = 11; prints 11. Second call: count = 11 + 1 = 12; prints 12.Final Answer:
11 12 -> Option AQuick Check:
Closure increments count on each call [OK]
- Assuming count resets each call
- Confusing initial value with first output
- Expecting compilation error due to var usage
Ready to prove it?
Pass the test and this pattern moves unknown
