Survey
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
CSE-321 Programming Languages Introduction to Functional Programming 박성우 POSTECH March 5, 2009 Programming Paradigms • Structured programming – C, Pascal, … • Object-oriented programming – C++, Java, … • Logic programming – Prolog, … • Functional programming – SML, Haskell, Objective Caml, Lisp, Scheme, F#, … 2 Functional Language SML • Standard ML – ML = Meta-Language • An example of programming language whose design is based on the programming language theory – type theory • Programming language for your assignments 3 Designer of SML 4 Familiar? 5 WTH? 6 Outline • • • • • • • • • • Expressions and values Variables Functions Types Recursion Datatypes Pattern matching Higher-order functions Exceptions Modules 7 Imperative Language 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; 8 Functional Language 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? 9 Evaluation Expression Value • An expression “evaluates” to a value. • We “evaluate” an expression to obtain a value. 10 Integer Evaluation 1 + 1 2 1 - 1 0 1 * 1 1 … 11 Boolean Evaluation 1 = 1 true 1 <> 1 false 1 <> 0 true … 12 An Integer Expression if 1 = ~1 then 10 else ~10 if false then 10 else ~10 ~10 13 Values as Expressions 1 ??? 14 Outline • • • • • • • • • • Expressions and values V Variables Functions Types Recursion Datatypes Pattern matching Higher-order functions Exceptions Modules 17 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 18 Local Declaration let val x = 1 val y = x + x val z = y + y in z + z end 8 19 Nested Local Declaration let let val x = 1 in val y = <expression> in x + x y + y end end let val y = let val x = 1 in x + x end in y + y end 20 Why “Local”? let val y = let val x = 1 in x + x end in x + y end okay??? 21 Variables are NOT variable. • The contents of a variable never change. – immutability of variables • Surprise? – That’s because you are thinking about variables in imperative programming. variables in SML <> variables in C 22 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 VS. ((1 + 1) + (1 + 1)) + ((1 + 1) + (1 + 1)) What if it takes 10 hours to evaluate 1? 23 Outline • • • • • • • • • • Expressions and values V Variables V Functions Types Recursion Datatypes Pattern matching Higher-order functions Exceptions Modules 24 When is the first time you learned the concept of function? 25 즐거운 낱말 공부 시간 • 함수(函數): 두 변수 x, y간에 어떤 관계가 있어 x의 변화에 따라 y가 일정한 법칙으로 변화할 때 y를 x의 함수라 함. (function) (동아 마스타 국어사전) 26 즐거운 한자 공부 시간 •函 1. 함(함). 2. 편지(함) 3. 갑옷(함) 4. 넣을, 들일(함) 예: (書函) 서함: 책을 넣는 상자 27 Function = 函數 = Box Number! 28 Using a Box Number 29 Using a Box Number - Generalized … … 30 Function in SML = Box Number (fn x => x + 1) n = 31 Function Application … (fn x => x + 1) n • We “apply” (fn x => x + 1) to n. • x is called a formal argument/parameter. • n is called an actual argument/parameter. 32 Evaluating a Function Application … (fn x => x + 1) n n+ 1 … 33 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; 34 Function Applications incr 1 (fn x => x + 1) 1 1 + 1 2 35 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 –… 36 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! 37 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. 38 Box Number as Output … … such that … … 39 Box Number as Output x … … +x 40 Box Number as Output x y y+x 41 Box Number as Output x y fn y => y+x y+x 42 Box Number as Output x y fn y => y+x y+x fn y => y+x 43 Box Number as Output x y fn x => (fn y => y+x) fn y => y+x y+x fn y => y+x 44 In SML • Recall the following declarations are equivalent: – val incr = fn x => x + 1; – fun incr x = x + 1; • Then: – val add = fn x => (fn y => y + x); – fun add x = fn y => y + x; – fun add x y = y + x; • add takes only one argument, not two! • In fact, every function in SML takes only one argument. 45 Adding Two Integers add 1 2 (fn x => (fn y => y + x)) 1 2 (fn y => y + 1) 2 2 + 1 3 46 Box Number as Input ( true, false) 47 Box Number as Input f fn f => (f true, f false) ( f true, f false) 48 Outline • • • • • • • • • • Expressions and values V Variables V Functions V Types Recursion Datatypes Pattern matching Higher-order functions Exceptions Modules 49 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 50 Type Preservation Expression : T Value : T • An evaluation preserves the type of a given expression. 51 Example let val x = 1 val y = x + x val z = y + y in z + z end : int 8 : int 52 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; 53 Type of add x fn x => (fn y => y+x) fn y => y+x 54 Type of add int fn x => (fn y => y+x) fn y => y+x 55 Type of add int fn x => (fn y => y+x) int -> int 56 Type of add int int -> (int -> int) int -> int 57 What is the Type? f fn f => (f true, f false) ( f true, f false) 58 f : bool -> int ? f : (bool -> int) -> fn f => (f true, f false) int * int ( f true, f false) 59 But why is it f : bool -> int ? 60 Why not f : bool -> char ? f : (bool -> char) -> fn f => (f true, f false) char * char ( f true, f false) 61 Then why not f : f : f : f : f : … bool bool bool bool bool -> -> -> -> -> string ? int * string ? unit ? (int -> int) ? <crazy type> ? 62 So we need Polymorphism. 63 Announcement • Assignment 1 will be out tonight. – Due at 11:59pm, March 12 (next Thursday) – Details of the instruction are all in the handout. – If you don't find your handin directory, email me. • Makeup lecture – 정통연 143호, 9:30am, tomorrow 64