KEMBAR78
Intro f# functional_programming | PPTX
F#
F#
F# is a multiparadigm
programming language
built on .NET
F#
F# is a scalable, simple, succinct,
type-safe, type-inferred, practical,
efficiently executing functional-
first/imperative/object –oriented,
explorative
Open Source programming language
built on .NET
F# and Open Source
F# 4.0 compiler + library
Open Source
Apache 2.0 license
F# is case-sensitive
let number = 1
let Number = 2
let NUMBER = 3
Whitespace/Indentation/Scope
The F# compiler allows you to use whitespace to delimit code blocks.
let sum (x,y) =
x + y
Declarations
let pi = 3.14159
floating-point constant
let sum x y = x + y
a function in two arguments
Let
let [value,
function,
module,
namespace,
class] = expression
Types of Defined Entities
F# manages to find types automatically:
This is called type inference
For instance
let pi = 3.14159
Here, pi will automatically obtain the type
float since 3.14159 can only have type float
Explicit Type Declarations
let sum x y = x + y
F# will assume that “+” is plus on the
type int.
let sum x y = (x + y) : float
It forces the function to have type
float
.NET Interop
open System
let timeOfDay = DateTime.Now.ToString("hh:mm:ss")
The F# failwith Function
F# has an failwith function, which when executed prints a string and stops the
execution.
let rec sqr n:float =
if n<0. then
failwith("Cannot compute the square root of a negative number in R")
else
Math.Sqrt n
Interop from F#
Use #r to reference a DLL .
Open the namespace
#r "System.Core.dll"
open System.Collections.Generic
let a = HashSet<int>()
F#
F# -> Imperative Programming
F# -> Declarative Programming
C#
A C# program usually
consists of statements to
change the program’s
state.
Imperative language
An imperative language
describes how to finish a
task with exact steps.
Imperative programming
How to make a scrambled egg
Control Flow
Branching with if/else
Looping with while/do
Looping with for
Handling exceptions
Computation as sequence
X = 3
Y = 7
X = 2X+Y
X = 13
Y = 7
State Before Control Flow State After
Focus on how to
do something
Change of state
Procedural
programming is a
common sub-type
You can have
function calls or
sub-routines
Frequently
combined with
object-oriented
programming
Imperative language
Functional Language
A functional-first language,
like F#, is more declarative,
describing what the program
should accomplish.
Computation as calculation
2*3+7 6+7
13
Declarative
Calculate the sum of the first ten
integers.
let result = [ 1 .. 10 ]
|> List.sum
Declarative
Calculate the sum of the first ten
integers.
let result = [ 1 .. 10 ]
|> List.reduce
(fun x this -> x + this)
Sum of first ten integers (C#)
int sum = 0;
for (int i = 1; i <= 10; i++)
{
sum += i;
}
Sum
Variable
C#
C# doesn’t allow the definition of
a function outside a class. So the
best practice is to create a static
function (method) into a class.
Sum of n integers with C#
int sum = 0;
int[] numbers = { 2,5,6,3,7,38,555,66 };
foreach (var item in numbers)
{
sum += item;
}
Imperative programming
open System.IO
open System.Net
let url = @"http://mahamudra.it/"
// Download the webpage
let req = WebRequest.Create(url)
let resp = req.GetResponse()
let stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let html = reader.ReadToEnd()
Syntactic sugar with C#
var url = @"http://mahamudra.it/";
var html = string.Empty;
// Download the webpage
var req = WebRequest.Create(url);
var resp = req.GetResponse();
using (var stream = resp.GetResponseStream())
{
using (var reader = new StreamReader (stream))
{
html = reader.ReadToEnd();
}
}
DRY
Do Not Repeat YourSelf
Procedural Programming
open System.IO
open System.Net
let getHtml url
// Download the webpage
let req = WebRequest.Create(url)
let resp = req.GetResponse()
let stream = resp.GetResponseStream()
let reader = new StreamReader(stream)
let html = reader.ReadToEnd()
html
But…
Functional Ideas
First-class Functions /
Higher-order Functions
• Functions can be passes as
arguments to other
functions
Purity
• Function calls don’t change
state
Immutable Data
• Data structures cannot be
modified
Reference
transparency
• Function results depend
only on its arguments
FP vs OOP
Object Oriented Programming (oop)
Object Oriented Programming (oop)
Functional Programming
F(x) g(x) gof(x)
body
p0 p1 p…
Return
f(p1,p2,..)
What’s a function?
pn
Parameters/
values
Name f
•A function f from a set X (the domain) to a set Y
(the range) maps each element x in X to a unique
element y in Y.
•For example, f(x) = x2 maps the set of real
numbers into the set of positive real numbers.
•i.e., the domain X is the set of all real
numbers, the range is the set of positive reals.
Background: Functions
Functions model determinism
X
F(X)
F(X)X’
F(X’)
Per ogni x esiste uno
ed un solo y tale che
f(x) sia uguale a y
outputs depend predictably on inputs
X’’ F(X’’)
F: x->F(x)
Functional Programming
f(x) g(x)
gof(x)
g(f(x))x f(x)
x g(f(x))
•If f is a function from X to Y and g is a function from Y
to Z, then (g ◦ f ) (x) is a function from X to Z defined
as
(g ◦ f ) (x) = g(f (x)), for all x in X
Simply put, it means to replace the x in g(x) with f (x).
•Example:
•f (x) = x2 + x; g(x) = 2x + 1
•g ◦ f = 2*f(x) + 1 = 2(x2 + x ) + 1
Background: Functional Composition
•Example using mathematical functions:
•f (x) = x2 + x
•g(x) = 2x + 1
•g ◦ f = 2(x2 + x ) + 1
•Example using programming language function
•int f (x) {x2 + x};
•int g(x) {2x + 1};
•Now, g(f(x))is {2 * f(x) + 1};
Background: Functional Composition
•Pure functional programming is state-free: no
assignment statements.
•In other words, no variables, no way to permanently
change memory.
•Programs in pure functional languages consist of
composite functions; output of each function becomes
input to another.
•Today, most functional languages have some imperative
statements.
Almost functional language
First Class Function
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
First Class Function
First-class functions can
either accept another
function as an argument or
return a
function.
Higher order functions
Higher order functions
are those that take other
functions as parameters or
return other functions as
their results.
First Class Function
let execute fn a =
fn(a)
val execute : f:('a -> 'b) -> a:'a -> 'b
let result = execute (fun x -> x*x) 5
val result : int = 25
Function types
Pure Functions
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Pure functions
Pure functions are functions
that have no side effects. Also
called referentially transparent
functions.
Side Effects
[<EntryPoint>]
let main argv =
let result = execute (fun x->x*x) 5
printfn "%d" result
0 // return an integer exit code
Void vs Unit
Unit Types
// define a function returns unit
let f x = () // f : 'a -> unit
// use ignore to throw away the keyboard
input and f2 returns unit
let f2 () = System.Console.ReadKey() |>
ignore
Side effects
f(5) + f(5) <> 2*f(5)
Side effects requires a more
complex model, and thus makes
it harder to understand the
software
Recursion
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Recursion
A recursive function is a
function that calls itself.
Example
The factorial function “!” on
natural numbers
0! = 1
n! = n · (n − 1)!, n > 0
Recursion corresponds to loops in ordinary programming
Factorial
let rec fac n =
if n = 0 then 1 else n*fac (n-1)
Immutable variables
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Immutability
The value assigned to a
variable or a structure can’t
be change once initialized.
Value not Variable
.NET types
Immutability
integers strings date time
F#
Immutability
Seq Set List
In imperative programming, variables are used to
denote memory locations:
x = x + 1
means “Update the program state by adding 1 to
the value stored in the memory cell named x and
storing the sum back in the memory cell.”
x is used two ways: as an r-value and an l-
value
Semantics of Variables
• Functional languages adopt the mathematical notion of
a variable as something that represents an expression.
•There is no association with a memory location or
modification of a variable’s value.
• So in functional languages a variable represents an
immutable value.
•Since variables don’t get updated, there’s no concept
of assignment and consequently no notion of program
state.
Semantics of Variables
Practical motivation
public class Utility
{
static int n = 1;
public static int fun (int x)
{
n += 1;
return n+x;
}
}
Fun isn’t fun
This means that fun returns different values for
different calls, even when called with the same
argument.
Much harder to reason mathematically about such
functions: for instance, these values are different:
var result = Utility.fun(10) + Utility.fun(10);
var result = 2* Utility.fun(10) ;
Nonstrict evaluation
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Nonstrict evaluation
Nonstrict means that we can
have a variable that does not
get assigned (computed) until
the first time it is referenced.
Lazy loading (C#)
int[] list = {1,34,5,666,76};
var even_terms = from p in list where (p % 2==0) select p;
var it_does_not_matter = 1;
var count_even_terms = even_terms.Count();
it_does_not_matter.Dump();
count_even_terms.Dump();
Statements
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Statements
Statements are evaluable
pieces of code that have a
return value.
Statements
First-class
functions
Pure
functions
Recursion
Immutable
variables
Nonstrict
evaluation
Statements
Pattern
matching
Match vs Case
Match
F# has a case construct
match expr with
| pattern1 -> expr1
| pattern2 -> expr2
....
Pattern Matching
Select case
let isOdd number =
match number % 2 with
| 0 -> false
| _ -> true
* “_” is a “wildcard”, matches anything
Factorial
let rec fac n =
match n with
| 0 -> 1
| _ -> n*fac (n-1)
Sum of first ten integers
let rec sum lst =
match lst with
| [] -> 0
| head::tail->head+ sum tail
let result = sum [1..10]
Sum of n integers
let rec sum lst =
match lst with
| [] -> 0
| head::tail->head+ sum tail
let result = sum [2;5;6;3;7;38;555;66]
Take
let rec take n lista =
match (n,lista) with
| (0,_) -> []
| (_,[]) -> failwith "taking too many"
| (_,x::ls) -> x :: take (n-1) ls

Intro f# functional_programming