Bird
Raised Fist0
Kotlinprogramming~5 mins

Returning functions from functions in Kotlin

Choose your learning style10 modes available
Introduction

Sometimes you want a function to create and give you another function to use later. This helps keep your code neat and flexible.

When you want to create a custom calculator that changes behavior based on input.
When you need to delay some work until later but decide what work to do now.
When you want to build small reusable pieces that can be combined in different ways.
When you want to create a function that remembers some information and uses it later.
Syntax
Kotlin
fun outerFunction(): (Int) -> Int {
    return fun(innerValue: Int): Int {
        return innerValue * 2
    }
}

The outer function returns another function as its result.

The returned function can take parameters and return a value.

Examples
This function returns another function that multiplies its input by a given factor.
Kotlin
fun makeMultiplier(factor: Int): (Int) -> Int {
    return { number -> number * factor }
}
This function returns a function that greets the given name when called.
Kotlin
fun greeter(name: String): () -> String {
    return { "Hello, $name!" }
}
Sample Program

This program creates a function that adds 5 to any number. Then it uses that function to add 5 to 10 and 3.

Kotlin
fun makeAdder(x: Int): (Int) -> Int {
    return { y -> x + y }
}

fun main() {
    val addFive = makeAdder(5)
    println(addFive(10))
    println(addFive(3))
}
OutputSuccess
Important Notes

You can use lambda expressions to return functions easily.

Returned functions can capture variables from the outer function (called closures).

Summary

Functions can return other functions to create flexible and reusable code.

Returned functions can take parameters and use values from the outer function.

Practice

(1/5)
1. What does it mean when a Kotlin function returns another function?
easy
A. The function can only return primitive data types like Int or String.
B. The function cannot have parameters if it returns another function.
C. The outer function produces a function as its result that can be called later.
D. The returned function must be called immediately inside the outer function.

Solution

  1. Step 1: Understand function return types

    In Kotlin, a function can return any type, including another function type.
  2. Step 2: Interpret returning a function

    Returning a function means the outer function gives back a function that can be stored or called later.
  3. Final Answer:

    The outer function produces a function as its result that can be called later. -> Option C
  4. Quick Check:

    Returning a function means output is a callable function [OK]
Hint: Returning function means output is a callable function [OK]
Common Mistakes:
  • Thinking only primitive types can be returned
  • Assuming returned function must be called immediately
  • Believing returned functions cannot have parameters
2. Which of the following is the correct syntax to declare a Kotlin function that returns another function taking an Int and returning a String?
easy
A. fun outer(): (Int) -> String = { i -> i.toString }
B. fun outer(): (Int) -> String { return { i -> i.toString() } }
C. fun outer(): (Int) String { return { i -> i.toString() } }
D. fun outer(): Int -> String = return { i -> i.toString() } }

Solution

  1. Step 1: Check function return type syntax

    In Kotlin, a function returning another function uses syntax like: fun name(): (ParamType) -> ReturnType
  2. Step 2: Verify the return statement

    The function returns a lambda matching (Int) -> String, e.g., { i -> i.toString() }
  3. Final Answer:

    fun outer(): (Int) -> String { return { i -> i.toString() } } -> Option B
  4. Quick Check:

    Correct function type syntax = fun outer(): (Int) -> String { return { i -> i.toString() } } [OK]
Hint: Return type for function is (ParamType) -> ReturnType [OK]
Common Mistakes:
  • Using arrow -> incorrectly in return type
  • Mixing return type syntax with function body
  • Omitting parentheses around function type
3. What is the output of this Kotlin code?
fun makeMultiplier(x: Int): (Int) -> Int {
    return { y -> x * y }
}

fun main() {
    val multiplyBy3 = makeMultiplier(3)
    println(multiplyBy3(5))
}
medium
A. 35
B. 8
C. Compilation error
D. 15

Solution

  1. Step 1: Understand makeMultiplier function

    makeMultiplier returns a function that multiplies its input by x (captured from outer function).
  2. Step 2: Trace main function calls

    multiplyBy3 is a function multiplying by 3; multiplyBy3(5) = 3 * 5 = 15.
  3. Final Answer:

    15 -> Option D
  4. Quick Check:

    3 * 5 = 15 [OK]
Hint: Returned function uses captured outer variable [OK]
Common Mistakes:
  • Confusing parameter names
  • Forgetting the closure captures x
  • Expecting immediate multiplication without calling returned function
4. Identify the error in this Kotlin code that tries to return a function:
fun outer(): (Int) -> Int {
    val inner = { x: Int -> x * 2 }
    return inner()
}
medium
A. Calling inner() instead of returning the function itself
B. Missing return type declaration for outer function
C. Incorrect lambda parameter syntax
D. Cannot return a lambda from a function

Solution

  1. Step 1: Analyze return statement

    inner is a lambda function; inner() calls it and returns Int, not a function.
  2. Step 2: Correct return value

    To return the function itself, return inner without parentheses.
  3. Final Answer:

    Calling inner() instead of returning the function itself -> Option A
  4. Quick Check:

    Return function, not function call [OK]
Hint: Return function name without () to return function itself [OK]
Common Mistakes:
  • Returning function call instead of function
  • Omitting function return type
  • Misunderstanding lambda syntax
5. Given this Kotlin code, what will be the output?
fun createCounter(start: Int): () -> Int {
    var count = start
    return {
        count += 1
        count
    }
}

fun main() {
    val counter = createCounter(10)
    println(counter())
    println(counter())
}
hard
A. 11 12
B. 10 11
C. 12 13
D. Compilation error

Solution

  1. Step 1: Understand closure capturing variable

    The returned lambda captures 'count' variable and increments it each call.
  2. Step 2: Trace calls to counter()

    First call: count = 10 + 1 = 11; prints 11. Second call: count = 11 + 1 = 12; prints 12.
  3. Final Answer:

    11 12 -> Option A
  4. Quick Check:

    Closure increments count on each call [OK]
Hint: Closures keep state between calls [OK]
Common Mistakes:
  • Assuming count resets each call
  • Confusing initial value with first output
  • Expecting compilation error due to var usage
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard