COMP 302: Programming Languages and Paradigms
Week 4: Higher-Order Functions Prof. Xujie Si
Slogan: functions are first-class citizen
Copyright By PowCoder代写 加微信 powcoder
Slogan: functions are first-class citizen
• Functions are values!
• Values can be passed around, manipulated, and returned. • So are functions!
• Higher-order function
• A function that takes a function as an argument, or returns a function
Slogan: functions are first-class citizen
• Functions are values!
• Values can be passed around, manipulated, and returned. • So are functions!
• Higher-order function
• A function that takes a function as an argument, or returns a function
Slogan: functions are first-class citizen
• Functions are values!
• Values can be passed around, manipulated, and returned. • So are functions!
• Higher-order function
• A function that takes a function as an argument, or returns a function
Slogan: functions are first-class citizen
• Functions are values!
• Values can be passed around, manipulated, and returned. • So are functions!
• Higher-order function
• A function that takes a function as an argument, or returns a function
Example: addition is a higher-order function!
let add x y = x + y
Example: addition is a higher-order function!
let add x y = x + y
Example: addition is a higher-order function!
let add x y = x + y letadd= funxy->x+y
Example: addition is a higher-order function!
let add x y = x + y letadd= funxy->x+y let add = function
Example: addition is a higher-order function!
let add x y = x + y letadd= funxy->x+y let add = function x ->
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10)
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10)
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10)
add : int -> int -> int
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10)
add : int -> int -> int
add : int -> (int -> int)
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
add : int -> int -> int
add : int -> (int -> int)
f : int -> int -> int -> int
= (function x -> function y -> x + y) 2
let add_two = add 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10) = 12
Example: addition is a higher-order function!
let add x y = x + y
letadd= funxy->x+y
let add = function x -> function y -> x + y
add : int -> int -> int
add : int -> (int -> int)
f : int -> int -> int -> int
f : int ->(int ->(int -> int))
let add_two = add 2
= (function x -> function y -> x + y) 2
= (function y -> 2 + y)
let res = add_two 10
= (function y -> 2 + y) 10
= (2 + 10)
Example: apply_twice
Example: apply_twice
let apply_twice f x = f (f x)
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float (f x): float
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float (f x): float
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float
f : int -> int
(f x): float
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float
f : int -> int
(f x): float
(f x): int
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float
f : int -> int
(f x): float
(f x): int
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
f : int -> float (f x): float
f : int -> int (f x): int x : ‘a f : ‘a -> ‘a
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
apply_twice : (‘a -> ‘a) -> ‘a -> ‘a
f : int -> float (f x): float
f : int -> int (f x): int x : ‘a f : ‘a -> ‘a
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
apply_twice : (‘a -> ‘a) -> ‘a -> ‘a
let apply_twice (f : ‘a -> ‘a) (x : ‘a) : ‘a =
f : int -> float (f x): float
f : int -> int (f x): int x : ‘a f : ‘a -> ‘a
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
apply_twice : (‘a -> ‘a) -> ‘a -> ‘a
let apply_twice (f : ‘a -> ‘a) (x : ‘a) : ‘a =
Howabout x:int->int??
f : int -> float (f x): float
f : int -> int (f x): int x : ‘a f : ‘a -> ‘a
Example: apply_twice
let apply_twice f x = f (f x)
= function f -> function x -> f (f x)
apply_twice : (‘a -> ‘a) -> ‘a -> ‘a
let apply_twice (f : ‘a -> ‘a) (x : ‘a) : ‘a =
Howabout x:int->int??
x : int -> int -> int ??
f : int -> float (f x): float
f : int -> int (f x): int
f : ‘a -> ‘a
let addT2 (x, y) = x + y
letaddT2(x,y)=x+y addT2:int*int->int
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c
let currying f = ???
function x -> function y -> f (x,y)
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
function x -> function y -> f (x,y)
currying : (‘a * ‘b -> ‘c) -> ‘a -> ‘b -> ‘c
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
function x -> function y -> f (x,y)
currying : (‘a * ‘b -> ‘c) -> ‘a -> ‘b -> ‘c
let uncurrying g = ???
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
function x -> function y -> f (x,y)
currying : (‘a * ‘b -> ‘c) -> ‘a -> ‘b -> ‘c
let uncurrying g = ???
function (x,y) -> g x y
letaddT2(x,y)=x+y addT2:int*int->int let add x y = x + y add : int -> int -> int
f : ‘a * ‘b -> ‘c g : ‘a -> ‘b -> ‘c let currying f = ???
function x -> function y -> f (x,y)
currying : (‘a * ‘b -> ‘c) -> ‘a -> ‘b -> ‘c
let uncurrying g = ???
function (x,y) -> g x y
uncurrying : (‘a -> ‘b -> ‘c) -> ‘a * ‘b -> ‘c
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
One more example: sum numbers
Can we have a generic sum function?
One more example: sum numbers
Can we have a generic sum function?
One more example: sum numbers
Can we have a generic sum function?
let f = fun x -> x
One more example: sum numbers
Can we have a generic sum function?
let f = fun x -> x
let f = fun x -> square x
One more example: sum numbers
Can we have a generic sum function?
let f = fun x -> x
let f = fun x -> square x
let f = square
One more example: sum numbers
Can we have a generic sum function?
let f = fun x -> x
let f = fun x -> square x
let f = square
let f = fun x -> exp(2,x)
Common Higher-Order Functions (Built-in)
Ocaml List Library API: https://ocaml.org/api/List.html
fold_left vs fold_right
fold_left vs fold_right
fold_left vs fold_right
fold_left vs fold_right
bop x [y1;y2;…;yn]
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
bop [y1;y2;…;yn] x
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
bop [y1;y2;…;yn] x
(y1 `bop` … (y_{n-1} `bop` (yn `bop` x)))
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
bop [y1;y2;…;yn] x
(y1 `bop` … (y_{n-1} `bop` (yn `bop` x)))
let sum ls = List.fold_left (+) 0 ls
fold_left vs fold_right
bop x [y1;y2;…;yn] (((x `bop` y1) `bop` y2) … `bop` yn)
bop [y1;y2;…;yn] x
(y1 `bop` … (y_{n-1} `bop` (yn `bop` x)))
let sum ls = List.fold_left (+) 0 ls
let sum ls = List.fold_right (+) ls 0
Some Exercises
• Increase each number in a list by 10 (List.map)
• Sum up numbers in a list (List.fold_right, List.fold_left) • Reverse a list (List.fold_right, List.fold_left)
• Check if a list contains a negative number (List.exists) • Check if all numbers in a list are positive (List.for_all)
• Only keep odd numbers in a list (List.filter)
Some Exercises
• Increase each number in a list by 10 (List.map)
• Sum up numbers in a list (List.fold_right, List.fold_left) • Reverse a list (List.fold_right, List.fold_left)
• Check if a list contains a negative number (List.exists) • Check if all numbers in a list are positive (List.for_all)
• Only keep odd numbers in a list (List.filter)
let reverse ls = List.fold_left (fun xs x -> x :: xs) [] ls
程序代写 CS代考 加微信: powcoder QQ: 1823890830 Email: powcoder@163.com