670 likes | 1.2k Views
CSE-321 Programming Languages Introduction to Functional Programming. 박성우. POSTECH March 8, 2006. Programming Paradigms. Structural programming C, Pascal, … Object-oriented programming C++, Java, … Logic programming Prolog, … Functional programming
E N D
CSE-321 Programming LanguagesIntroduction to Functional Programming 박성우 POSTECH March 8, 2006
Programming Paradigms • Structural programming • C, Pascal, … • Object-oriented programming • C++, Java, … • Logic programming • Prolog, … • Functional programming • SML, Haskell, Objective Caml, Lisp, Scheme, …
Outline • Expressions and values • Variables • Functions • Types • Recursion • Datatypes • Pattern matching • Higher-order functions • Exceptions • Modules
C • A program consists of commands. • command = “do something” • Nothing wrong: if (x == 1) then x = x + 1; else x = x - 1; • Nothing wrong either: if (x == 1) then x = x + 1;
SML • A program consists of expressions. • expression = “obtain a value” • Nothing wrong: if (x = 1) then x + 1 else x - 1 • But this does not make sense: if (x = 1) then x + 1 • what is the value if x <> 1?
Evaluation • An expression “evaluates” to a value. • We “evaluate” an expression to obtain a value. Expression Value
Integer Evaluation 1 + 1 2 1 - 1 0 1 * 1 1 …
Boolean Evaluation 1 = 1 true 1 <> 1 false 1 <> 0 true …
An Integer Expression if1 = ~1then 10 else ~10 iffalsethen 10 else~10 ~10
Values as Expressions 1 ???
Everything is an Expression! • 1 • ~1 • 1 =~1 • 10 • ~10 • if1 =~1then10else~10 if1 =~1then10else~10
Actually Not Everything • Ill-formed expressions • if1 =~1then10 (x) • if 1 = ~1then10else~10 (x) if1 =~1then10else~10
Outline • Expressions and values V • Variables • Functions • Types • Recursion • Datatypes • Pattern matching • Higher-order functions • Exceptions • Modules
Variable Declaration - val x = 1 + 1; val x = 2 : int • A variable x is “bound” to value 2. • From now on, any occurrence of x is replaced by 2. - val y = x + x; val y = 4 : int
Local Declaration • let • val x = 1 • val y = x + x • val z = y + y • in • z + z • end 8
Nested Local Declaration • let • val x = 1 • in • x + x • end • let • val y = <expression> • in • y + y • end • let • val y = letval x = 1 in x + x end • in • y + y • end
Why “Local”? • let • val y = let • valx = 1 • in • x + x • end • in • x + y • end okay???
Variables are NOT variable. • The contents of a variable never change. • Surprise? • That’s because you are thinking about variables in imperative programming. variables in SML <> variables in C • Once you get used to functional programming,immutability of variables in functional programming will be taken for granted!
Then Why Variables? • Any advantage in using variables at all? • let • val x = 1 • val y = x + x • val z = y + y • in • z + z • end ((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)) VS. What if it takes 10 hours to evaluate 1?
Outline • Expressions and values V • Variables V • Functions • Types • Recursion • Datatypes • Pattern matching • Higher-order functions • Exceptions • Modules
즐거운 낱말공부 시간 • 함수(函數): 두 변수 x, y간에 어떤 관계가 있어 x의 변화에 따라 y가 일정한 법칙으로 변화할 때 y를 x의 함수라 함. (function) (동아 마스타 국어사전)
즐거운 한자 공부 시간 • 函 1. 함(함). 2. 편지(함) 3. 갑옷(함) 4. 넣을, 들일(함) 예: (書函) 서함: 책을 넣는 상자
Function in SML = Box Number (fn x => x + 1) n =
Function Application • We “apply” (fn x => x + 1) to n. • x is called a formal argument/parameter. • n is called an actual argument/parameter. … (fn x => x + 1) n
… … Evaluating a Function Application (fn x => x + 1) n n+ 1
Functions in SML • Nameless function • fn x => x + 1; • Storing a nameless function to a variable • val incr = fn x => x + 1; • Function declaration • fun incr x = x + 1;
Function Applications incr 1 (fn x => x + 1) 1 1 + 1 2
So far, So good, So easy.
First-class Objects • First-class objects = primitive objects • can be stored in a variable. • can be passed as an argument to a function. • can be returned as a return value of a function. • Examples: • integers • booleans • characters • floating-point numbers • …
First-class Objects in C • First-class objects • integers • characters • floating-point numbers • pointers • structures • … • Functions? • Function pointers are first-class objects. • But functions are not. • Why? You cannot create new functions on the fly!
Functions = First-class Objects in SML • Functions: • can be passed as an argument to a function. • can be returned as a return value of a function.
… … … … Box Number as Output such that
… … Box Number as Output x +x
Box Number as Output x y y+x
Box Number as Output x y fn y => y+x y+x
Box Number as Output x y fn y => y+x y+x fn y => y+x
Box Number as Output x y fnx => (fn y => y+x) fn y => y+x y+x fn y => y+x
In SML • Recall the following declarations are equivalent: • val incr = fnx => x + 1; • fun incr x = x + 1; • Then: • val add = fnx => (fny => y + x); • fun add x = fny => y + x; • fun add xy = y + x; • add takes only one argument, not two! • In fact, every function in SML takes only a single argument.
Adding Two Integers add 1 2 (fnx => (fny => y + x)) 1 2 (fny => y + 1) 2 2 + 1 3
Box Number as Input ( true, false)
Box Number as Input f fnf => (f true, f false) ( true, false) f f
Outline • Expressions and values V • Variables V • Functions V • Types • Recursion • Datatypes • Pattern matching • Higher-order functions • Exceptions • Modules
Types • A type specifies what kind of value a given expression evaluates to. • 1 + 1 : int • true andalso false : bool • #”A” : char • ”hello” : string • (1, true) : int * bool • (1, ~1, true) : int * int * bool • 1.0 : real • () : unit
Type Preservation • An evaluation preserves the type of a given expression. • Type preservation will be discussed in detail later in this course. • It’s a lot more important than you might think! Expression : T Value : T
Example • let • val x = 1 • val y = x + x • val z = y + y • in • z + z • end : int 8 : int
Function Types • T -> T’ • type of functions: • taking arguments of type T • returning values of type T’ • Example: • val incr = fn x => x + 1;val incr = fn : int -> int • fun incr x = x + 1;val incr = fn : int -> int • Explicit type annotation • val incr = fn (x:int) => x + 1; val incr = fn (x:int) : int => x + 1; • fun incr (x:int)= x + 1; fun incr (x:int) : int = x + 1;