Scala | Partially Applied functions

The Partially applied functions are the functions which are not applied on all the arguments defined by the stated function i.e, while invoking a function, we can supply some of the arguments and the left arguments are supplied when required. we call a function we can pass less arguments in it and when we pass less arguments it does not throw an exception. these arguments which are not passed to function we use hyphen( _ ) as placeholder.
Some important points:

  • Partially applied functions are helpful in minimizing a function which accepts many arguments to a function that accepts only some arguments.
  • It can replace any number of arguments defined by a function.
  • It is easier for users to utilize this method.

Syntax:

val multiply = (a: Int, b: Int, c: Int) => a * b * c

// less arguments passed
val f = multiply(1, 2, _: Int)

As we can see in above syntax we defined a normal function multiply which have three arguments we pass less arguments (two). we can see it does not throw an exception that is partially applied function.
Example:



filter_none

edit
close

play_arrow

link
brightness_4
code

// Scala program of Partially
// applied functions
  
// Creating object
object Applied
{
  
    // Main method
    def main(args: Array[String])
    {
  
        // Creating a Partially applied
        // function
        def Book(discount: Double, costprice: Double) 
        : Double =
        {
  
            (1 - discount/100) * costprice
  
        }
  
        // Applying only one argument
        val discountedPrice = Book(25, _: Double)
  
        // Displays discounted price
        // of the book
        println(discountedPrice(400))
  
    }
}

chevron_right


Output:

300.0

Here, the discount is passed in the argument and costprice part is left empty which can be passed later when required so, the discounted price can be calculated any number of times.

Some more examples of Partially applied functions:

  1. A partially applied function can be obtained even when not applied on any of the arguments defined.
    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Scala program of Partially
    // applied functions
      
    // Creating object
    object Applied
    {
      
        // Main method
        def main(args: Array[String])
        {
      
            // Creating a Partially applied
            // function
            def Mul(x: Double, y: Double)
            : Double =
            {
                x * y
            }
      
            // Not applying any argument
            val r = Mul _
      
            // Displays Multiplication
            println(r(9, 8))
        }
    }

    chevron_right

    
    

    Output:

    72.0
    
  2. Partially applied functions can be utilized to replace any number of parameters.
    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Scala program of Partially
    // applied functions
      
    // Creating object
    object Applied
    {
      
        // Main method
        def main(args: Array[String])
        {
      
            // Creating a Partially applied
            // function
            def Mul(x: Double, y: Double, z: Double)
            : Double =
            {
                x * y * z
            }
      
            // applying some arguments
            val r = Mul(7, 8, _ : Double)
      
            // Displays Multiplication
            println(r(10))
        }
    }

    chevron_right

    
    

    Output:

    560.0
    
  3. Currying approach can be utilized in Partially applied functions to transmit a function with multiple arguments into multiple functions, where each function takes only one argument.
    Example:

    filter_none

    edit
    close

    play_arrow

    link
    brightness_4
    code

    // Scala program of Partially
    // applied functions using
    // Currying approach
      
    // Creating object
    object curr
    {
      
        // Main method
        def main(args: Array[String])
        {
      
            // Creating a Partially applied
            // function
            def div(x: Double, y: Double) 
            : Double =
            {
                x / y
            }
      
            // applying currying approach 
            val m = (div _).curried
      
            // Displays division
            println(m(72)(9))
        }
    }

    chevron_right

    
    

    Output:

    8.0
    

    Here, currying approach breaks the given function into two functions, where each function takes one parameter so, you need to pass one value for each of the functions and get the desired output.



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :

Be the First to upvote.


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.