SlideShare a Scribd company logo
1 of 24
Scala Functions & Closures




Neelkanth Sachdeva

Consultant / Software Engineer

Knoldus Software LLP , New Delhi

neelkanthsachdeva.wordpress.com

neelkanth@knoldus.com
Methods

The most common way to define a function is
as a member of some object.Such a function is
called a Method.
/*
 * Normal Functions
 */

object LongLines extends App{

    def ProcessFile(fileName: String, width: Int)
{
        val source = Source.fromFile(fileName)
        for (line <- source.getLines)
          processLine(fileName, width, line)
    }

    private def processLine(filename: String,
      width: Int, line: String) {
      if (line.length > width)
        println(filename + ": " + line)
    }
}
Local functions

Programs should be decomposed into many small functions that each
do a well-defined task. One problem with this approach is that all the
helper function names can pollute the program name space
In Java →
1.Defining private methods.
In Scala →
1. Defining private methods also works
                 +
2. You can define functions inside other functions
/*
 * Defining Local Functions More Easily
 */
object LongLines extends App {

    def ProcessFile(fileName: String,width: Int) {

        def processLine(line: String) {
          if (line.length > width)
            println(fileName + ": " + line)
        }

        val source = Source.fromFile(fileName)
        for (line <- source.getLines)
          processLine(line)
    }
}
First-class functions

Scala has first-class functions. Not only can you
define functions and call them, but you can write
down functions as unnamed literals and then
pass them around as values.
Function Literals

A function literal is compiled into a class that
when instantiated at runtime is a function value.
Then What is the difference ?
Thus the distinction between function literals and
values is that function literals exist in the source
code, whereas function values exist as objects at
runtime.
Example:

Simple function literal :-

 (x: Int) => x + 1

The => designates that this function converts the thing on the left (any
integer x) to the thing on the right (x + 1). So, this is a function mapping
any integer x to x + 1.
Function values are objects, so

→ you can store them in variables

 scala> var increase = (x: Int) => x + 1
 increase: (Int) => Int = <function>

They are functions too , so

→ you can invoke them using the usual parentheses
  function-call notation.

   scala> increase(10)
   res0: Int = 11
We've seen the nuts and bolts of function literals and function
values. Many Scala libraries give you opportunities to use
them e.g

foreach method:

scala> val someNumbers = List(-11, -10, -5, 0, 5, 10)
someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10)
scala> someNumbers.foreach((x: Int) => println(x))

filter method:

scala> someNumbers.filter((x: Int) => x > 0)
Short forms of function literals
Scala provides a number of ways to leave out redundant information and
write function literals more briefly. Keep your eyes open for these
opportunities, because they allow you to remove clutter from your code.


One way to make a function literal more brief is to leave off the parameter
types. Thus, the previous example with filter could be written like this:


scala> someNumbers.filter((x) => x > 0)
res7: List[Int] = List(5, 10)
Even leave the parentheses around x
scala> someNumbers.filter( x => x > 0)
res7: List[Int] = List(5, 10)
Placeholder syntax

To make a function literal even more concise, you
can use underscores as placeholders for one or
more parameters, so long as each parameter
appears only one time within the function literal.


scala> someNumbers.filter( _ > 0)
res9: List[Int] = List(5, 10)
Partially applied functions

someNumbers.foreach( println _ )
Scala treats this short form exactly as if you had
written the following:
someNumbers.foreach(x => println(x))


When you use an underscore in this way, you are
writing a partially applied function.
Examples:



scala> def sum(a: Int, b: Int, c: Int) = a + b + c
sum: (Int,Int,Int)Int

scala> sum(1, 2, 3)
res0: Int = 6

scala> val a = sum _
a: (Int, Int, Int) => Int = <function>

scala> a.apply(1, 2, 3)
res1: Int = 6
scala> val b = sum(1, _: Int, 3)
b: (Int) => Int = <function>

scala> b(2)
res15: Int = 6

In this case, b.apply invoked sum(1, 2, 3).

scala> val c = sum

<console>:5: error: missing arguments for method sum...
follow this method with `_' if you want to treat it as
a partially applied function
val c = sum
          ˆ
Closures
x → by contrast, is a bound variable, because it
does have a meaning in the context of the
function: it is defined as the function’s lone
parameter, an Int.


more → more is a free variable, because the
Function literal does not itself give a meaning to it.
So the closures is :

The function value (the object) that’s created at
runtime from this function literal is called a
closure.
(x: Int) => x + 1, is called a closed term,
Thus a function value created at runtime from
this function literal is not a closure in the strictest
Sense .


(x: Int) => x + more, is an open term. Therefore,
any function value created at runtime from (x: Int) => x +
more will by definition require that a binding for its free
variable, more, be captured. The resulting function value,
which will contain a reference to the captured more variable,
is called a closure,
Repeated Parameters

Scala allows you to indicate that the last
parameter to a function may be repeated. This
allows clients to pass variable length argument
lists to the function.
Thank You

More Related Content

What's hot

Java Script Language Tutorial
Java Script Language TutorialJava Script Language Tutorial
Java Script Language Tutorial
vikram singh
 
Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
Sandip Kumar
 

What's hot (19)

Java Script Language Tutorial
Java Script Language TutorialJava Script Language Tutorial
Java Script Language Tutorial
 
Javascript
JavascriptJavascript
Javascript
 
Namespace in C++ Programming Language
Namespace in C++ Programming LanguageNamespace in C++ Programming Language
Namespace in C++ Programming Language
 
Python dictionary
Python   dictionaryPython   dictionary
Python dictionary
 
Books
BooksBooks
Books
 
Linq Introduction
Linq IntroductionLinq Introduction
Linq Introduction
 
Java 8 Lambda Expressions
Java 8 Lambda ExpressionsJava 8 Lambda Expressions
Java 8 Lambda Expressions
 
Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
 
Lambdas HOL
Lambdas HOLLambdas HOL
Lambdas HOL
 
Scala oo (1)
Scala oo (1)Scala oo (1)
Scala oo (1)
 
Python functions
Python functionsPython functions
Python functions
 
Basics of Functional Programming
Basics of Functional ProgrammingBasics of Functional Programming
Basics of Functional Programming
 
Functions in python slide share
Functions in python slide shareFunctions in python slide share
Functions in python slide share
 
Functional Java 8 in everyday life
Functional Java 8 in everyday lifeFunctional Java 8 in everyday life
Functional Java 8 in everyday life
 
Chapter 16 Dictionaries
Chapter 16 DictionariesChapter 16 Dictionaries
Chapter 16 Dictionaries
 
Intro to functional programming
Intro to functional programmingIntro to functional programming
Intro to functional programming
 
First approach in linq
First approach in linqFirst approach in linq
First approach in linq
 
Functions1
Functions1Functions1
Functions1
 
Pxb For Yapc2008
Pxb For Yapc2008Pxb For Yapc2008
Pxb For Yapc2008
 

Viewers also liked

Viewers also liked (17)

Akka Futures and Akka Remoting
Akka Futures  and Akka RemotingAkka Futures  and Akka Remoting
Akka Futures and Akka Remoting
 
Traits in scala
Traits in scalaTraits in scala
Traits in scala
 
Simple build tool
Simple build toolSimple build tool
Simple build tool
 
Slickdemo
SlickdemoSlickdemo
Slickdemo
 
Knolx session
Knolx sessionKnolx session
Knolx session
 
Intro lift
Intro liftIntro lift
Intro lift
 
Implicit conversion and parameters
Implicit conversion and parametersImplicit conversion and parameters
Implicit conversion and parameters
 
Intoduction on Playframework
Intoduction on PlayframeworkIntoduction on Playframework
Intoduction on Playframework
 
String Interpolation in Scala
String Interpolation in ScalaString Interpolation in Scala
String Interpolation in Scala
 
WorkingWithSlick2.1.0
WorkingWithSlick2.1.0WorkingWithSlick2.1.0
WorkingWithSlick2.1.0
 
Traits inscala
Traits inscalaTraits inscala
Traits inscala
 
Akka vikas hazrati
Akka vikas hazratiAkka vikas hazrati
Akka vikas hazrati
 
Modular programming Using Object in Scala
Modular programming Using Object in ScalaModular programming Using Object in Scala
Modular programming Using Object in Scala
 
FitNesse With Scala
FitNesse With ScalaFitNesse With Scala
FitNesse With Scala
 
Dependency injection in Scala
Dependency injection in ScalaDependency injection in Scala
Dependency injection in Scala
 
Highcharts
HighchartsHighcharts
Highcharts
 
Reactive programming with scala and akka
Reactive programming with scala and akkaReactive programming with scala and akka
Reactive programming with scala and akka
 

Similar to Functions & Closures in Scala

Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
Sandip Kumar
 
Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
Sandip Kumar
 
Ti1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: PolymorphismTi1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: Polymorphism
Eelco Visser
 

Similar to Functions & Closures in Scala (20)

Scala functions
Scala functionsScala functions
Scala functions
 
Principles of functional progrmming in scala
Principles of functional progrmming in scalaPrinciples of functional progrmming in scala
Principles of functional progrmming in scala
 
Functions In Scala
Functions In Scala Functions In Scala
Functions In Scala
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 
Functions in C++
Functions in C++Functions in C++
Functions in C++
 
Functions in C++
Functions in C++Functions in C++
Functions in C++
 
Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
 
Functional Objects & Function and Closures
Functional Objects  & Function and ClosuresFunctional Objects  & Function and Closures
Functional Objects & Function and Closures
 
Python functions part12
Python functions  part12Python functions  part12
Python functions part12
 
Google06
Google06Google06
Google06
 
Functional Programming With Scala
Functional Programming With ScalaFunctional Programming With Scala
Functional Programming With Scala
 
Ti1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: PolymorphismTi1220 Lecture 7: Polymorphism
Ti1220 Lecture 7: Polymorphism
 
Functional Objects in Ruby: new horizons – Valentine Ostakh
Functional Objects in Ruby: new horizons  – Valentine OstakhFunctional Objects in Ruby: new horizons  – Valentine Ostakh
Functional Objects in Ruby: new horizons – Valentine Ostakh
 
All About ... Functions
All About ... FunctionsAll About ... Functions
All About ... Functions
 
Lecture 3
Lecture 3Lecture 3
Lecture 3
 
04_python_functions.ppt You can define functions to provide the required func...
04_python_functions.ppt You can define functions to provide the required func...04_python_functions.ppt You can define functions to provide the required func...
04_python_functions.ppt You can define functions to provide the required func...
 
Scala google
Scala google Scala google
Scala google
 
Python and You Series
Python and You SeriesPython and You Series
Python and You Series
 
functions.pptx
functions.pptxfunctions.pptx
functions.pptx
 
Python functions
Python functionsPython functions
Python functions
 

More from Knoldus Inc.

More from Knoldus Inc. (20)

Authentication in Svelte using cookies.pptx
Authentication in Svelte using cookies.pptxAuthentication in Svelte using cookies.pptx
Authentication in Svelte using cookies.pptx
 
OAuth2 Implementation Presentation (Java)
OAuth2 Implementation Presentation (Java)OAuth2 Implementation Presentation (Java)
OAuth2 Implementation Presentation (Java)
 
Supply chain security with Kubeclarity.pptx
Supply chain security with Kubeclarity.pptxSupply chain security with Kubeclarity.pptx
Supply chain security with Kubeclarity.pptx
 
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML ParsingMastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
Mastering Web Scraping with JSoup Unlocking the Secrets of HTML Parsing
 
Akka gRPC Essentials A Hands-On Introduction
Akka gRPC Essentials A Hands-On IntroductionAkka gRPC Essentials A Hands-On Introduction
Akka gRPC Essentials A Hands-On Introduction
 
Entity Core with Core Microservices.pptx
Entity Core with Core Microservices.pptxEntity Core with Core Microservices.pptx
Entity Core with Core Microservices.pptx
 
Introduction to Redis and its features.pptx
Introduction to Redis and its features.pptxIntroduction to Redis and its features.pptx
Introduction to Redis and its features.pptx
 
GraphQL with .NET Core Microservices.pdf
GraphQL with .NET Core Microservices.pdfGraphQL with .NET Core Microservices.pdf
GraphQL with .NET Core Microservices.pdf
 
NuGet Packages Presentation (DoT NeT).pptx
NuGet Packages Presentation (DoT NeT).pptxNuGet Packages Presentation (DoT NeT).pptx
NuGet Packages Presentation (DoT NeT).pptx
 
Data Quality in Test Automation Navigating the Path to Reliable Testing
Data Quality in Test Automation Navigating the Path to Reliable TestingData Quality in Test Automation Navigating the Path to Reliable Testing
Data Quality in Test Automation Navigating the Path to Reliable Testing
 
K8sGPTThe AI​ way to diagnose Kubernetes
K8sGPTThe AI​ way to diagnose KubernetesK8sGPTThe AI​ way to diagnose Kubernetes
K8sGPTThe AI​ way to diagnose Kubernetes
 
Introduction to Circle Ci Presentation.pptx
Introduction to Circle Ci Presentation.pptxIntroduction to Circle Ci Presentation.pptx
Introduction to Circle Ci Presentation.pptx
 
Robusta -Tool Presentation (DevOps).pptx
Robusta -Tool Presentation (DevOps).pptxRobusta -Tool Presentation (DevOps).pptx
Robusta -Tool Presentation (DevOps).pptx
 
Optimizing Kubernetes using GOLDILOCKS.pptx
Optimizing Kubernetes using GOLDILOCKS.pptxOptimizing Kubernetes using GOLDILOCKS.pptx
Optimizing Kubernetes using GOLDILOCKS.pptx
 
Azure Function App Exception Handling.pptx
Azure Function App Exception Handling.pptxAzure Function App Exception Handling.pptx
Azure Function App Exception Handling.pptx
 
CQRS Design Pattern Presentation (Java).pptx
CQRS Design Pattern Presentation (Java).pptxCQRS Design Pattern Presentation (Java).pptx
CQRS Design Pattern Presentation (Java).pptx
 
ETL Observability: Azure to Snowflake Presentation
ETL Observability: Azure to Snowflake PresentationETL Observability: Azure to Snowflake Presentation
ETL Observability: Azure to Snowflake Presentation
 
Scripting with K6 - Beyond the Basics Presentation
Scripting with K6 - Beyond the Basics PresentationScripting with K6 - Beyond the Basics Presentation
Scripting with K6 - Beyond the Basics Presentation
 
Getting started with dotnet core Web APIs
Getting started with dotnet core Web APIsGetting started with dotnet core Web APIs
Getting started with dotnet core Web APIs
 
Introduction To Rust part II Presentation
Introduction To Rust part II PresentationIntroduction To Rust part II Presentation
Introduction To Rust part II Presentation
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Recently uploaded (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
AI+A11Y 11MAY2024 HYDERBAD GAAD 2024 - HelloA11Y (11 May 2024)
 
Introduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDMIntroduction to use of FHIR Documents in ABDM
Introduction to use of FHIR Documents in ABDM
 
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdfRising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
Rising Above_ Dubai Floods and the Fortitude of Dubai International Airport.pdf
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
CNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In PakistanCNIC Information System with Pakdata Cf In Pakistan
CNIC Information System with Pakdata Cf In Pakistan
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 AmsterdamDEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
DEV meet-up UiPath Document Understanding May 7 2024 Amsterdam
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 

Functions & Closures in Scala

  • 1. Scala Functions & Closures Neelkanth Sachdeva Consultant / Software Engineer Knoldus Software LLP , New Delhi neelkanthsachdeva.wordpress.com neelkanth@knoldus.com
  • 2. Methods The most common way to define a function is as a member of some object.Such a function is called a Method.
  • 3. /* * Normal Functions */ object LongLines extends App{ def ProcessFile(fileName: String, width: Int) { val source = Source.fromFile(fileName) for (line <- source.getLines) processLine(fileName, width, line) } private def processLine(filename: String, width: Int, line: String) { if (line.length > width) println(filename + ": " + line) } }
  • 4. Local functions Programs should be decomposed into many small functions that each do a well-defined task. One problem with this approach is that all the helper function names can pollute the program name space In Java → 1.Defining private methods. In Scala → 1. Defining private methods also works + 2. You can define functions inside other functions
  • 5. /* * Defining Local Functions More Easily */ object LongLines extends App { def ProcessFile(fileName: String,width: Int) { def processLine(line: String) { if (line.length > width) println(fileName + ": " + line) } val source = Source.fromFile(fileName) for (line <- source.getLines) processLine(line) } }
  • 6. First-class functions Scala has first-class functions. Not only can you define functions and call them, but you can write down functions as unnamed literals and then pass them around as values.
  • 7.
  • 8. Function Literals A function literal is compiled into a class that when instantiated at runtime is a function value. Then What is the difference ? Thus the distinction between function literals and values is that function literals exist in the source code, whereas function values exist as objects at runtime.
  • 9. Example: Simple function literal :- (x: Int) => x + 1 The => designates that this function converts the thing on the left (any integer x) to the thing on the right (x + 1). So, this is a function mapping any integer x to x + 1.
  • 10. Function values are objects, so → you can store them in variables scala> var increase = (x: Int) => x + 1 increase: (Int) => Int = <function> They are functions too , so → you can invoke them using the usual parentheses function-call notation. scala> increase(10) res0: Int = 11
  • 11. We've seen the nuts and bolts of function literals and function values. Many Scala libraries give you opportunities to use them e.g foreach method: scala> val someNumbers = List(-11, -10, -5, 0, 5, 10) someNumbers: List[Int] = List(-11, -10, -5, 0, 5, 10) scala> someNumbers.foreach((x: Int) => println(x)) filter method: scala> someNumbers.filter((x: Int) => x > 0)
  • 12. Short forms of function literals Scala provides a number of ways to leave out redundant information and write function literals more briefly. Keep your eyes open for these opportunities, because they allow you to remove clutter from your code. One way to make a function literal more brief is to leave off the parameter types. Thus, the previous example with filter could be written like this: scala> someNumbers.filter((x) => x > 0) res7: List[Int] = List(5, 10) Even leave the parentheses around x scala> someNumbers.filter( x => x > 0) res7: List[Int] = List(5, 10)
  • 13. Placeholder syntax To make a function literal even more concise, you can use underscores as placeholders for one or more parameters, so long as each parameter appears only one time within the function literal. scala> someNumbers.filter( _ > 0) res9: List[Int] = List(5, 10)
  • 14. Partially applied functions someNumbers.foreach( println _ ) Scala treats this short form exactly as if you had written the following: someNumbers.foreach(x => println(x)) When you use an underscore in this way, you are writing a partially applied function.
  • 15. Examples: scala> def sum(a: Int, b: Int, c: Int) = a + b + c sum: (Int,Int,Int)Int scala> sum(1, 2, 3) res0: Int = 6 scala> val a = sum _ a: (Int, Int, Int) => Int = <function> scala> a.apply(1, 2, 3) res1: Int = 6
  • 16. scala> val b = sum(1, _: Int, 3) b: (Int) => Int = <function> scala> b(2) res15: Int = 6 In this case, b.apply invoked sum(1, 2, 3). scala> val c = sum <console>:5: error: missing arguments for method sum... follow this method with `_' if you want to treat it as a partially applied function val c = sum ˆ
  • 18. x → by contrast, is a bound variable, because it does have a meaning in the context of the function: it is defined as the function’s lone parameter, an Int. more → more is a free variable, because the Function literal does not itself give a meaning to it.
  • 19.
  • 20. So the closures is : The function value (the object) that’s created at runtime from this function literal is called a closure.
  • 21. (x: Int) => x + 1, is called a closed term, Thus a function value created at runtime from this function literal is not a closure in the strictest Sense . (x: Int) => x + more, is an open term. Therefore, any function value created at runtime from (x: Int) => x + more will by definition require that a binding for its free variable, more, be captured. The resulting function value, which will contain a reference to the captured more variable, is called a closure,
  • 22. Repeated Parameters Scala allows you to indicate that the last parameter to a function may be repeated. This allows clients to pass variable length argument lists to the function.
  • 23.