Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java...
Transcript of Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java...
![Page 2: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/2.jpg)
2
Announcements
• MP9 is due at 11:59pm on Tuesday, Apr 1• HW9 (Written Homework) is due on Thursday,
and should be turned in class
![Page 3: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/3.jpg)
3
Objectives
• Language Features• Function Objects in Java• Function Objects in C++• Function Objects in C#
• C++ STL (Standard Template Library)• Template Metaprogramming in C++
• 2 QUIZ Questions in the middle
![Page 4: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/4.jpg)
4
Function Object
• Function Object • Also called Functor or Functionoid• A programming construct allowing an object to be
invoked or called as if it were an ordinary function.
In Ocaml
map (fun x -> x+1) [1;2;3;4]
inside of map,(fun x -> x+1) (1)(fun x -> x+1) (2)…
In Object-Oriented Lang.
List map(IntFun f, List l);
inside of map,j = f(i);
But f is an object.
Class IntFun{….}
![Page 5: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/5.jpg)
5
Purposes
• More Expressiveness• Sometime simpler and more convenient than other
approaches• High-Order Functions
• Resilient to Design Changes• We don’t need to change the interface• Create New Functionality without writing new
functions.
![Page 6: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/6.jpg)
6
Function Objects in Java
• Function Interface
• Inner Class
interface IntFun{int apply(int x);
}
class Succ implements IntFun {… //blahblah}
map( new IntFun{
int apply(int x){ return x+1;}}, A);
In Ocaml
map (fun x -> x+1) A;
![Page 7: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/7.jpg)
7
Function Objects in Java
• Function Interface Example 1
interface IntFun{int apply(int x);
}
… //some classes and blah
void map(IntFun f, int A[]){for(int i = 0, i < A.length; i++)
A[i] = f.apply(A[i]);}
class Succ implements IntFun{int apply(int x){
return x + 1;}
}
… //some classes and blah
int A[30];…map(new Succ(), A);
![Page 8: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/8.jpg)
8
Function Objects in Java
• Function Interface Example 2
interface IntBinaryPred{boolean apply(int x, int y);
}
class GT implements IntBinaryPred{boolean apply(int x, int y) {
retun x > y;}
}
interface BoolBinaryPred{boolean apply(boolean x, boolean y);
}
class And implements BoolBinaryPred{boolean apply(boolean x, boolean y){
return x && y;}
}
interface BoolBinaryPred{boolean apply(boolean x, boolean y);
}
class And implements BoolBinaryPred{boolean apply(boolean x, boolean y){
return x && y;}
}
interface IntBinaryPred{boolean apply(int x, int y);
}
class GT implements IntBinaryPred{boolean apply(int x, int y) {
return x > y;}
}
interface BoolBinaryPred{boolean apply(boolean x, boolean y);
}
class And implements BoolBinaryPred{boolean apply(boolean x, boolean y){
return x && y;}
}
![Page 9: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/9.jpg)
9
Function Objects in Java
• Inner Class
interface IntBinaryPred{boolean apply(int x, int y);
}
class GT implements IntBinaryPred{boolean apply(int x, int y) {
retun x > y;}
}
…CompareArray(new GT(), A, B);
interface IntBinaryPred{boolean apply(int x, int y);
}
…CompareArray(
new IntBinaryPred{boolean apply(int x, int y){
return x > y;}}, A, B);
interface IntBinaryPred{boolean apply(int x, int y);
}
class GT implements IntBinaryPred{boolean apply(int x, int y) {
retun x > y;}
}
…CompareArray(new GT(), A, B);
interface IntBinaryPred{boolean apply(int x, int y);
}
…CompareArray(
new IntBinaryPred{boolean apply(int x, int y){
return x > y;}}, A, B);
![Page 10: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/10.jpg)
10
Function Objects in Java
• Real Example - Comparator
List<String> list = Arrays.asList(new String[] {"10", "1", "20", "11", "21", "12"
});
Collections.sort(list, new Comparator<String>() {
public int compare(String o1, String o2) {return Integer.valueOf(o1).compareTo(Integer.valueOf(o2));
}}
);
![Page 11: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/11.jpg)
11
Function Objects in Java
• High-Order Function Objects
interface IntFun{int apply(int x);
}
IntFun combine-add(IntFun f, IntFun g){return new IntFun{
int apply(int x) {return f.apply(x) + g.apply(x);
}};
} In Ocaml,let combine-add f g = fun x -> (f x) + (g x)
![Page 12: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/12.jpg)
12
Function Objects in Java
• High-Order Function Objects
interface IntFun{int apply(int x);
}interface IntFun2{
int apply(int x, int y);}
IntFun compose2 (IntFun2 f, IntFun g, IntFun h){return new IntFun{
int apply(int x) {return f.apply(g.apply(x), h.apply(x));
}};
}
In Ocaml,let compose2 f g h = fun x -> f(g x, h x)
QUIZ Question 1
![Page 13: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/13.jpg)
13
Function Objects in C++
• Operator Overloading
new String(“Sam”)new String(“teaches”)
new String(“Sam”) + new String(“teaches”)
class String{public:String operator+ (String a, String b){
// blahblah}
}
![Page 14: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/14.jpg)
14
Function Objects in C++
• Operator Overloading
Succ succ = new Succ();
a = succ(3);
class Succ{public:int operator() (int x){
return x + 1;}
}
![Page 15: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/15.jpg)
15
Function Objects in C++
• Operator Overloading Example 1
class Succ{public:int operator() (int x){
return x + 1;}
}
template<class IntFun>void map(IntFun f, int *A, int n){
for(int i = 0; i < n; i++)A[i] = f ( A[i] );
}
![Page 16: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/16.jpg)
16
Function Objects in C++
• Operator Overloading Example 2
class GT{public:bool operator() (int x, int y){
return x > y;}
}
class AND{public:bool operator() (bool x, bool y){
return x && y;}
}
![Page 17: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/17.jpg)
17
Function Objects in C++
• High-Order Functors - Example 1
template<class IntFun> class Combine_Add{
public:IntFun f, g;Combine_Add(IntFun f, IntFun g){
this.f = f;this.g = g;
}int operator() (int x){
return f(x) + g(x);}
}
In Ocaml,
let combine-add f g = fun x -> (f x) + (g x)
template<class IntFun> class Combine_Add{
public:IntFun f, g;Combine_Add(IntFun f, IntFun g){
this.f = f;this.g = g;
}int operator() (int x){
return f(x) + g(x);}
}
In Ocaml,
let combine-add f g = fun x -> (f x) + (g x)
![Page 18: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/18.jpg)
18
Function Objects in C++
• High-Order Functors - Example 2
template<class IntFun> class Funmod{
public:IntFun f; int x, y;Combine_Add(IntFun f, int x, int y){
this.f = f; this.x = x; this.y = y;}int operator() (int z){
if(x == z)return y;
elsereturn f(z);
}}
In Ocaml,
let funmod f x y = fun z ->if x = z then y else f z;
QUIZ Question 2
![Page 19: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/19.jpg)
19
Function Objects in C#
• delegatepublic delegate int IntFun(int x);
public class Example0{int Succ(int x){return x + 1;}
public static void Main(){
IntFun f = new IntFun(Succ);
Console.WriteLine(f(3)); //4}
}
![Page 20: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/20.jpg)
20
Function Objects in C#
• delegate – Example 1public delegate int IntFun(int x);
public class Example1{int Succ(int x){return x + 1;}
int[] map(IntFun f, int[] A){for(int i = 0; i < A.length; i++)
A[i] = f ( A[i] );}
public static void Main(){...map(new IntFun(Succ), A);
}}
![Page 21: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/21.jpg)
21
Function Objects in C#
• delegate – Example 2public delegate bool IntBinaryPred(int x, int y);public delegate bool BoolBinaryPred(bool x, bool y);
public class Example2{bool GT(int x, int y){return x > y;}bool AND(bool x, bool y){return x && y;}
public static void Main(){IntBinaryPred gt = new IntBinaryPred(GT);BoolBinaryPred and = new BoolBinaryPred(AND);
...}
}
![Page 22: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/22.jpg)
22
Function Objects in C#
• High-Order Function
public delegate int IntFun(int x);
public class Example2{IntFun combine_add(IntFun f, IntFun g){
return new delegate(int x) {return f(x) + g(x);
};}
}
In Ocaml,
let combine-add f g = fun x -> (f x) + (g x)
![Page 23: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/23.jpg)
23
C++ Standard Template Library
• C++ Library• To provide many of the basic algorithms and data
structures of computer science.• Generic library, meaning that its components are
heavily parameterized• http://www.sgi.com/tech/stl/table_of_contents.h
tml
![Page 24: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/24.jpg)
24
C++ Standard Template Library
• Exampletemplate <class InputIterator, class EqualityComparable>InputIterator find(InputIterator first, InputIterator last,
const EqualityComparable& value);
list<int> L;L.push_back(3);L.push_back(1);L.push_back(7);
list<int>::iterator result = find(L.begin(), L.end(), 7);
// result == L.end()// *result == 7
![Page 25: Functional Programming in Object Oriented Languages · PDF file7 Function Objects in Java • Function Interface Example 1 interface IntFun{int apply(int x);} //some classes and blah](https://reader031.fdocuments.us/reader031/viewer/2022022409/5a9eaf9b7f8b9a71178bb079/html5/thumbnails/25.jpg)
25
Template Meta-Programming
• Compile-time Class Generationtemplate <int N> struct Factorial {
enum { value = N * Factorial<N - 1>::value };};
template <>struct Factorial<0> {
enum { value = 1 };};
void foo() {int x = Factorial<4>::value; // == 24int y = Factorial<0>::value; // == 1
}