Functional Programming Professor Yihjia Tsai Tamkang University.

Slides:



Advertisements
Similar presentations
Kathleen Fisher cs242 Reading: “Concepts in Programming Languages”, Chapter 6.
Advertisements

Introduction to Compilation of Functional Languages Wanhe Zhang Computing and Software Department McMaster University 16 th, March, 2004.
1 Scheme and Functional Programming Aaron Bloomfield CS 415 Fall 2005.
CMSC 330: Organization of Programming Languages Tuples, Types, Conditionals and Recursion or “How many different OCaml topics can we cover in a single.
© M. Winter COSC 4P41 – Functional Programming Testing vs Proving Testing –uses a set of “typical” examples, –symbolic testing, –may find errors,
1 Programming Languages (CS 550) Lecture Summary Functional Programming and Operational Semantics for Scheme Jeremy R. Johnson.
Functional Programming. Pure Functional Programming Computation is largely performed by applying functions to values. The value of an expression depends.
0 LECTURE 5 LIST COMPREHENSIONS Graham Hutton University of Nottingham.
Memory Management Professor Yihjia Tsai Tamkang University.
4. Functional Programming. © O. Nierstrasz PS — Functional Programming 4.2 Roadmap Overview  Functional vs. Imperative Programming  Pattern Matching.
Chapter 15 Other Functional Languages. Copyright © 2007 Addison-Wesley. All rights reserved. Functional Languages Scheme and LISP have a simple syntax.
Advanced Programming Handout 12 Higher-Order Types (SOE Chapter 18)
0 PROGRAMMING IN HASKELL Chapter 6 - Recursive Functions Most of this should be review for you.
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 14 Functional Programming It is better to.
Compiler construction in4020 – lecture 13 Koen Langendoen Delft University of Technology The Netherlands.
CSC321: Programming Languages14-1 Programming Languages Tucker and Noonan Chapter 14: Functional Programming 14.1 Functions and the Lambda Calculus 14.2.
Sparkle A theorem prover for the functional language Clean Maarten de Mol University of Nijmegen February 2002.
Cse536 Functional Programming 1 7/14/2015 Lecture #2, Sept 29, 2004 Reading Assignments –Begin Chapter 2 of the Text Home work #1 can be found on the webpage,
Functional Programming in Haskell Motivation through Concrete Examples Adapted from Lectures by Simon Thompson.
PrasadCS7761 Haskell Data Types/ADT/Modules Type/Class Hierarchy Lazy Functional Language.
Functional Languages. Why? Referential Transparency Functions as first class objects Higher level of abstraction Potential for parallel execution.
Functional Programming Universitatea Politehnica Bucuresti Adina Magda Florea
Functional Programming in Scheme and Lisp. Overview In a functional programming language, functions are first class objects. You can create them, put.
0 REVIEW OF HASKELL A lightening tour in 45 minutes.
ISBN Chapter 15 Functional Programming Languages.
CSC 580 – Theory of Programming Languages, Spring, 2009 Week 9: Functional Languages ML and Haskell, Dr. Dale E. Parson.
Interpretation Environments and Evaluation. CS 354 Spring Translation Stages Lexical analysis (scanning) Parsing –Recognizing –Building parse tree.
1 ML fun x -> e e 1 e 2 0, 1, 2,..., +, -,... true, false, if e then e else e patterns datatypes exceptions structures functors let f x = e variables These.
Chapter 9: Functional Programming in a Typed Language.
1-Nov-15 Haskell II Functions and patterns. Data Types Int + - * / ^ even odd Float + - * / ^ sin cos pi truncate Char ord chr isSpace isUpper … Bool.
11/1/20151 GC16/3011 Functional Programming Lecture 5 Miranda patterns, functions, recursion and lists.
Functional Programming in Scheme and Lisp.
Chapter Fifteen: Functional Programming Languages Lesson 12.
Compiling Functional Programs Mooly Sagiv Chapter 7
Overview of the Haskell 98 Programming Language
CSE 230 The -Calculus. Background Developed in 1930’s by Alonzo Church Studied in logic and computer science Test bed for procedural and functional PLs.
ISBN Chapter 15 Functional Programming Languages.
ISBN Chapter 15 Functional Programming Languages.
TIVDM2Functional Programming Language Concepts 1 Concepts from Functional Programming Languages Peter Gorm Larsen.
COMP313A Functional Programming (1)
CS 2104 – Prog. Lang. Concepts Functional Programming II Lecturer : Dr. Abhik Roychoudhury School of Computing From Dr. Khoo Siau Cheng’s lecture notes.
1 Haskell Kevin Atkinson John Simmons. 2 Contents Introduction Type System Variables Functions Module System I/O Conclusions.
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell 101 Dr. Hyunyoung Lee.
Com Functional Programming Lazy Evaluation Marian Gheorghe Lecture 13 Module homepage Mole & ©University of Sheffieldcom2010.
-Calculus Kangwon National University 임현승 Programming Languages These slides are based on the slides by Prof. Sungwoo Park at POSTECH.
First Order Haskell Neil Mitchell York University λ.
Error Example - 65/4; ! Toplevel input: ! 65/4; ! ^^ ! Type clash: expression of type ! int ! cannot have type ! real.
CS5205Haskell1 CS5205: Foundation in Programming Languages Basics of Functional Programming.
CSE 5317/4305 L12: Higher-Order Functions1 Functional Languages and Higher-Order Functions Leonidas Fegaras.
Interpreters and Higher-Order Functions CSE 413 Autumn 2008 Credit: CSE341 notes by Dan Grossman.
1 FP Foundations, Scheme In Text: Chapter Chapter 14: FP Foundations, Scheme Mathematical Functions Def: A mathematical function is a mapping of.
Chap. 7, Syntax-Directed Compilation J. H. Wang Nov. 24, 2015.
Haskell Introduction CSCE 314 Spring CSCE 314 – Programming Studio Historical Background 1930s: Alonzo Church develops the lambda calculus, a simple.
Haskell Chapter 5, Part II. Topics  Review/More Higher Order Functions  Lambda functions  Folds.
1.SML Docs Standard Basis 2.First-Class Functions Anonymous Style Points Higher-Order 3.Examples Agenda.
Cs7120 (Prasad)L1-FP-HOF1 Functional Programming Basics Correctness > Clarity > Efficiency.
Cs776 (Prasad)L2HOF1 Higher-Order Functions. cs776 (Prasad)L2HOF2 Higher-Order Functions A function that takes a function as argument and/or returns a.
Ch Ch jcmt CSE 3302 Programming Languages CSE3302 Programming Languages (n-n-n-notes) Summer 2003 Dr. Carter Tiernan.
Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. L05-1 September 21, 2006http:// Types and Simple Type.
1 PROGRAMMING IN HASKELL An Introduction Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources)
6-Jul-16 Haskell II Functions and patterns. Data Types Int + - * / ^ even odd Float + - * / ^ sin cos pi truncate Char ord chr isSpace isUpper … Bool.
Functional Programming
Functional Programming
A lightening tour in 45 minutes
Important Concepts from Clojure
Important Concepts from Clojure
Higher-Order Procedures
FP Foundations, Scheme In Text: Chapter 14.
Important Concepts from Clojure
Presentation transcript:

Functional Programming Professor Yihjia Tsai Tamkang University

Quiz 5.9 The pointer assignment p := q is han- dled by first incrementing the reference count of q before decrementing that of p What goes wrong if the order is reversed? Increment q.ref count; Decrement p.ref count; IF p.ref count = 0: Free recursively (p); SET p TO q; ??

languages: LISP, scheme, ML, Miranda, Haskell features: high abstraction level: what vs how, where, when equational reasoning functions as first class citizens Functional programming languages: LISP, Scheme, ML, Miranda, Haskell features: compiler must work harder!!

Overview of a typical functional compiler high-level language (Haskell) functional core Cruntime system + optimizations desugaring type inference code generation

Function application concise notation precedence over all other operators HaskellC f 11 13f(11, 13) f n+1f(n) + 1

offside rule list notation pattern matching list comprehension offside rule: end-of-equation marking list notation pattern matching list comprehension offside rule list notation: pattern matching list comprehension [] [1,2,3] (1:(2:(3:[]))) offside rule list notation pattern matching: case analysis of arguments list comprehension Syntactic sugar qsort [] = [] qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y = x] offside rule list notation pattern matching list comprehension: mathematical sets

Polymorphic typing an expression is polymorphic if it ‘has many types’ examples length [] = 0 length (x:xs) = 1 + length xs empty list: [ ] list handling functions length :: [a] -> Int length [] = 0 length (x:xs) = 1 + length xs

Polymorphic type inference map f [] = [] map f (x:xs) = f x : map f xs map :: t 1 -> t 2 -> t 3 map f [] = [] map :: t 1 -> [a] -> [b] map f (x:xs) = f x : map f xs x :: a f :: a -> b map :: (a -> b) -> [a] -> [b]

Exercise (5 min.) infer the polymorphic type of the following higher-order function: filter f [] = [] filter f (x:xs) = if not(f x) then filter f xs else x : (filter f xs)

Answers

filter f [] = [] filter f (x:xs) = if not(f x) then filter f xs else x : (filter f xs) Answers filter :: t 1 -> t 2 -> t 3 filter f [] = [] filter :: t 1 -> [a] -> [b] x :: a f :: a -> Bool filter :: (a -> Bool) -> [a] -> [a] filter f (x:xs) = if not(f x) then filter f xs else x : (filter f xs)

Referential transparency f x always denotes the same value advantage: high-level optimization is easy disadvantage: no efficient in-place update g (f x) (f x) let a = f x in g a a add_one [] = [] add_one (x:xs) = x+1 : add_one xs

Higher-order functions functions are first-class citizens higher-order functions accept functions as parameters and/or return a function as result functions may be created “on the fly” D f = f where f (x) = lim h  0 f(x+h) – f(x) h diff f = f_ where f_ x = (f (x+h) – f x)/h h =

Currying: specialize functions Q: diff (unary function)  deriv (binary function)? deriv f x = (f (x+h) – f x)/h where h = diff f = f_ where f_ x = (f (x+h) – f x)/h h =  f,  x (diff f) x = deriv f x A: yes! binary function  a unary function returning a unary function f e 1 … e n  ( n f e 1 ) … e n ) (deriv square) is a curried function

Lazy evaluation An expression will only evaluated when its value is needed to progress the computation additional expressive power (infinite lists) overhead for delaying/resuming computations nats = [1..] squares = [x^2 | x <- nats] main = take 100 squares ones = 1 : ones deriv f x = lim [(f (x+h) – f x)/h | h <- downto 0] where downto x = [x + 1/2^n | n <- [1..]] lim (a:b:lst) = if abs (a/b – 1) < eps then b else lim (b:lst)

Structure of a typical functional compiler high-level language (Haskell) functional core Cruntime system + optimizations desugaring type inference code generation

Graph reduction implement h.o.f + lazy evaluation key: function application f e 1 … e n  ( n f e 1 ) e 2 ) … e n ) execution (interpretation) build graph for main expression find reducible expression (redex  func + args) instantiate body (build graph for    enen ( n e 1 e 2 ) e n )

Example let twice f x = f (f x) square n = n*n in twice square @ 3 * square3 * *

Reduction order a graph may contain multiple redexes lazy evaluation: choose built-in operators (+,-,*, etc) may have strict arguments that must be evaluated => recursive 3

Implementation typedef struct node *Pnode; extern Pnode eval( Pnode root); argument stack Graph reduction – three stroke engine find next redex instantiate rhs update root unwind application spine (f a 1 …a n ) Pnode mul(Pnode arg[]) { Pnode a = eval(arg[0]); Pnode b = eval(arg[1]); return Num(a->nd.num * b->nd.num); } update root with result call f, pass arguments in array (stack)

Code generation average a b = (a+b) / 2 Pnode average(Pnode arg[]) { Pnode a = arg[0]; Pnode b = arg[1]; return Appl(Appl(fun_div, Appl(Appl(fun_add,a),b)), Num(2)); } a

Short-circuiting application spines average a b = (a+b) / 2 Pnode average(Pnode arg[]) { Pnode a = arg[0]; Pnode b = arg[1]; return Appl(Appl(fun_div, Appl(Appl(fun_add,a),b)), Num(2)); } call leftmost outermost function directly Pnode average(Pnode arg[]) { Pnode a = arg[0]; Pnode b = arg[1]; return div(Appl(Appl(fun_add,a),b), Num(2)); } a

call leftmost outermost function directly Pnode average(Pnode arg[]) { Pnode a = arg[0]; Pnode b = arg[1]; return div(Appl(Appl(fun_add,a),b), Num(2)); } Strict arguments average a b = (a+b) / 2 evaluate expressions supplied to strict built-in functions immediately Pnode average(Pnode arg[]) { Pnode a = arg[0]; Pnode b = arg[1]; return div(add(a,b), Num(2)); } a

Strictness analysis user-defined functions: propagate sets of strict arguments up the AST foo x y = if x>0 then x*y else 0 if 0> x0 * xy {x}{} {x} {y} {x} {x,y}

Strictness propagation A i, if n  m fun A A n …… C  (T  E) if C then T else E L  RL  RL  RL  R propagated setlanguage construct  strict(fun,i) m i=1

Recursive functions foo x y = if x>0 then y else foo (x+1) y if > x0 * xy {x} {} foo y {x}{x,y} {}{x} {y} {x} + x1 {y} {x}{} problem: conservative estimation of strictness

Recursive functions foo x y = if x>0 then y else foo (x+1) y if > x0 * xy {x,y} foo y {x}{x,y} {}{x} {y} + x1 {x}{y} {x}{} solution: optimistic estimation of strictness iterate until result equals assumption (+,+)

Exercise (6 min.) infer the strict arguments of the following recursive function: how many iterations are needed? g x y 0 = x g x y z = g y x (z-1)

Answers stepassumptionresult

Answers g x y 0 = x g x y z = g y x (z-1) g x y z = if z == 0 then x else g y x (z-1) 4 {z} 3 {x,z} 2 {x,y,z} 1 resultassumptionstep

Summary Haskell featurecompiler phase offside rulelexical analyzer list notation list comprehension pattern matching parser polymorphic typingsemantic analyzer referential transparency higher-order functions lazy evaluation run-time system (graph reducer)

The end