Classical Themes of Computer Science Functional Programming (Part 1/2)

Classical Themes of Computer Science Functional Programming (Part 1/2)

Institute for Software Technology tugraz Classical Themes of Computer Science Functional Programming (Part 1/2) Bernhard K. Aichernig Institute for Software Technology Graz University of Technology Austria Winter Term 2014/15 Version: October 15, 2014 B.K. Aichernig Classical Themes of Computer Science 1 / 49 Institute for Software Technology tugraz Agenda I Functional Programming? I Elements of Functional Programming I Recursive Functions I Higher-Order Functions I Lists B.K. Aichernig Classical Themes of Computer Science 2 / 49 Institute for Software Technology tugraz Programming Paradigms Paradigm: In science, a paradigm describes distinct concepts or thought patterns in some scientific discipline. Main programming paradigms: I imperative programming I functional programming I logic programming Orthogonal to it: I object-oriented programming B.K. Aichernig Classical Themes of Computer Science 3 / 49 Institute for Software Technology tugraz History of Functional Programming Languages 1959 Lisp 1975-77 ML, FP, Scheme 1978 Smalltalk 1986 Standard ML 1988 Erlang 1990 Haskell 1999 XSLT 2000 OCaml 2003 Scala, XQuery 2005 F# 2007 Clojure B.K. Aichernig Classical Themes of Computer Science 4 / 49 Institute for Software Technology tugraz Functional Programs What is a Functional Program? I A Functional Program (FP) is an expression (syntax). I This expression denotes a Value (semantics). I To run a program has the same meaning as evaluating the expression. Functions are values, too! B.K. Aichernig Classical Themes of Computer Science 5 / 49 Institute for Software Technology tugraz Expressions An expression is I a constant, or I a variable, or I a term of the form e1(e2), with e1 and e2 being expressions. The evaluation of e1 must return a function. (prefix form) Consequence: A function may be applied to a function or returning a function (= higher-order functions). Note: All n-ary functions can be transformed into unary functions (= currying). Scala: All binary functions can be written in infix form. B.K. Aichernig Classical Themes of Computer Science 6 / 49 Institute for Software Technology tugraz Variables Variables I are like in mathematics I refer to values, not memory locations I are immutable I allow only single assignment Easy to parallelize: no mutable state, no shared memory, and no locks. B.K. Aichernig Classical Themes of Computer Science 7 / 49 Institute for Software Technology tugraz Pure FP Languages Pure functional programming languages accept functional programs only. They do not have mutable variables, assignments, or imperative control structures. I Pure Lisp, XSLT, XPath, XQuery, FP I Haskell (without I/O Monad or UnsafePerformIO) B.K. Aichernig Classical Themes of Computer Science 8 / 49 Institute for Software Technology tugraz FP Languages in a Wider Sense In a wider sense a functional programming language enables the construction of elegant programs that focus on functions. I Lisp, Scheme, Racket, Clojure I SML, Ocaml, F# I Haskell (full language) I Scala I Smalltalk, Ruby (!) B.K. Aichernig Classical Themes of Computer Science 9 / 49 Institute for Software Technology tugraz Scala I Combines functional programming and OO I By Martin Odersky, EPFL I Compiles to JVM and .NET I Strongly typed (generic types) I Type inferencing (minimal set of type declarations, rest inferred) I Pattern matching, case classes I Functions as parameters I Language is extensible (DSL), e.g., Erlang’s actor model I LinkedIn, Twitter, Novell, Sony, Siemens, etc. B.K. Aichernig Classical Themes of Computer Science 10 / 49 Institute for Software Technology tugraz Evaluation of Expressions Expressions evaluate like in a calculator and left to right: (4-1)*(4+5) ! 3*(4+5) ! 3*9 ! 27 In FP we can give expressions a name: valx=4+5 3*x ! valx=9 3*x ! 3*9 ! 27 Substitution principle: we replace variable names with their definitions. B.K. Aichernig Classical Themes of Computer Science 11 / 49 Institute for Software Technology tugraz Lazy Evaluation of Expressions Alternatively, using def, we may delay the evaluation of the definition until the variable is needed: defx=4+5 3*x ! 3*(4+5) ! 3*9 ! 27 This is called lazy evaluation. B.K. Aichernig Classical Themes of Computer Science 12 / 49 Institute for Software Technology tugraz Functions We may parameterize our definitions: def square(x: Int) = x * x def sumOfSquares(x: Int, y: Int) = square(x) + square(y) By default, function parameters are evaluated first, from left to right: sumOfSquares(1+2,1+3) ! sumOfSquares(3,1+3) ! sumOfSquares(3,4) ! square(3) + square(4) ! 3*3 + square(4) ! 9 + square(4) ! 9+4*4 ! 9+16 ! 25 This is called call by value. B.K. Aichernig Classical Themes of Computer Science 13 / 49 Institute for Software Technology tugraz Call by Name We may also delay the evaluation parameters using a special type declaration : =>Type def sumOfSquares(x: => Int, y: Int) = square(x) + square(y) sumOfSquares(1+2,1+3) ! sumOfSquares(1+2,4) ! square(1+2) + square(4) ! square(3) + square(4) ! 3*3 + square(4) ! 9 + square(4) ! 9+4*4 ! 9+16 ! 25 This lazy evaluation of parameters is known as call by name. B.K. Aichernig Classical Themes of Computer Science 14 / 49 Institute for Software Technology tugraz Call by Value vs. Call by Name I Both evaluation strategies reduce an expression to the same value, provided both evaluations terminate. I If Call by Value evaluation of an expression terminates, then its Call by Name evaluation terminates, too. I The reverse is not true! B.K. Aichernig Classical Themes of Computer Science 15 / 49 Institute for Software Technology tugraz Non-termination Example Consider a non-terminating (recursive) expression: 1 def loop : Int = loop 2 def firstByValue(x: Int, y: Int) = x 3 def firstByName(x: Int, y: => Int) = x Evaluating an expression under call by value: call by name: firstByValue(1+2, loop) firstByName(1+2, loop) ! ! firstByValue(3, loop) firstByName(3, loop) ! ! firstByValue(3, loop) 3 ! ... Here, Call by Name is also more efficient! B.K. Aichernig Classical Themes of Computer Science 16 / 49 Institute for Software Technology tugraz Boolean Expressions Reduction rules for Boolean expressions: !true ! false !false ! true true && b ! b false && b ! false true || b ! true false || b ! b b is an arbitrary Boolean expression Note that && and || use short-circuit evaluation Hence, in Boolean expressions lazy evaluation, e.g. Call by Name, may be beneficial. B.K. Aichernig Classical Themes of Computer Science 17 / 49 Institute for Software Technology tugraz Conditional Expression In FP we use conditional expressions, not conditional statements, to express alternatives. 1 def abs(x: Int) = if (x >=0) x else -x The Scala conditional if-else looks like Java’s, but has expression semantics. Reduction rules for conditional expressions: if(true) e elsef ! e if(false) e elsef ! f e, f are arbitrary expressions. B.K. Aichernig Classical Themes of Computer Science 18 / 49 Institute for Software Technology tugraz Recursive Functions In FP we use recursion in order to express iteration: 1 def fact(n: Int): Int = 2 if (n ==0)1 3 else n * fact(n -1) We can easily explain recursion using the substitution model: fact(3) ! if(3 ==0)1 else3 * fact(3-1) ! if(false)1 else3 * fact(3-1) ! 3 * fact(3-1) ! 3 * fact(2) ! 3* if(2 ==0)1 else2 * fact(2-1) ! 3* if(false)1 else2 * fact(2-1) ! 3*2 * fact(2-1) ! 3*2 * fact(1) B.K. Aichernig Classical Themes of Computer Science 19 / 49 Institute for Software Technology tugraz Recursive Functions (cont.) ! 3*2 * fact(1) ! 3*2* if(1 ==0)1 else1 * fact(1-1) ! 3*2* if(false)1 else1 * fact(1-1) ! 3*2*1 * fact(1-1) ! 3*2*1 * fact(0) ! 3*2*1* if(0 ==0)1 else0 * fact(0-1) ! 3*2*1* if(true)1 else0 * fact(0-1) ! 3*2*1*1 ! 6 Note the redundant last call! The substitution principle is possible, because we do not have side-effects (mutable data). B.K. Aichernig Classical Themes of Computer Science 20 / 49 Institute for Software Technology tugraz Pattern Expressions Most FP languages support pattern matching: 1 def fact1(n: Int): Int = n match{ 2 case0 =>1/* constant pattern*/ 3 case_ => n * fact1(n -1)/* don 't care pattern*/ 4 } Avoiding the last call: 1 def fact2(n: Int): Int = n match{ 2 case0 =>1 3 case1 =>1 4 case_ => n * fact2(n -1) 5 } B.K. Aichernig Classical Themes of Computer Science 21 / 49 Institute for Software Technology tugraz Pattern Expressions with Guards A defensive function using guards: 1 def fact3(n: Int): Int = n match{ 2 case_ ifn<0 => throw new Error("wrong argument!") 3 case0 =>1 4 case1 =>1 5 case_ => n * fact3(n -1) 6 } In Scala, we may throw any Java exception. B.K. Aichernig Classical Themes of Computer Science 22 / 49 Institute for Software Technology tugraz Pattern Expressions: MatchError A MatchError exception is thrown if no pattern matches the value of the selector Hence, we could also guard against non-termination, like this: 1 def fact4(n: Int): Int = n match{ 2 case0 =>1 3 case1 =>1 4 case_ ifn>1 => n * fact4(n -1) 5 } We will see more forms of patterns later! B.K. Aichernig Classical Themes of Computer Science 23 / 49 Institute for Software Technology tugraz Evaluating Match Expressions An expression of the form e match{casep1 =>e1 ... case pn =>en} matches the value of the selector e with the patterns p1, ..., pn in the order in which they are written. The whole match expression is rewritten to the right-hand side of the first case where the pattern matches the selector e. B.K. Aichernig Classical Themes of Computer Science 24 / 49 Institute for Software Technology tugraz Evaluating Match Expressions: Example 1 def fact2(n: Int): Int = n match{ 2 case0 =>1 3 case_ => n * fact2(n -1) 4 } fact2(1) ! 1 match{case0 =>1 case_ =>1 * fact2(1-1) ! 1 * fact2(1-1) ! 1 * fact2(0) ! 1*0 match{case0 =>1 case_ =>0 * fact2(0-1) ! 1*1 ! 1 B.K.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    49 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us