Introduction to Functional Programming Notes for CSCE 190 Based on Sebesta, Hutton, Ullman Marco Valtorta UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Language Families • Imperative (or Procedural, or Assignment-Based) • Functional (or Applicative) • Logic (or Declarative) UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Imperative Languages • Mostly influenced by the von Neumann computer architecture • Variables model memory cells, can be assigned to, and act differently from mathematical variables • Destructive assignment, which mimics the movement of data from memory to CPU and back • Iteration as a means of repetition is faster than the more natural recursion, because instructions to be repeated are stored in adjacent memory cells UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Functional Languages • Model of computation is the lambda calculus (of function application) • No variables or write-once variables • No destructive assignment • Program computes by applying a functional form to an argument • Program are built by composing simple functions into progressively more complicated ones • Recursion is the preferred means of repetition UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Logic Languages • • • • • Model of computation is the Post production system Write-once variables Rule-based programming Related to Horn logic, a subset of first-order logic AND and OR non-determinism can be exploited in parallel execution • Almost unbelievably simple semantics • Prolog is a compromise language: not a pure logic language UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering What is a Functional Language? Opinions differ, and it is difficult to give a precise definition, but generally speaking: • Functional programming is style of programming in which the basic method of computation is the application of functions to arguments; • A functional language is one that supports and encourages the functional style. UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Example Summing the integers 1 to 10 in Java: total = 0; for (i = 1; i 10; ++i) total = total+i; The computation method is variable assignment. UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering 7 Example Summing the integers 1 to 10 in Haskell: sum [1..10] The computation method is function application. UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering 8 Simple Function Definition fact 0 = 1 fact n = n * fact (n -1) fact1 = prod [1..n] fib 0 = 1 fib 1 = 1 fib (n + 2) = fib (n + 1) + fib n UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Guards and otherwise fact n | n == 0 = 1 | n > 0 = n * fact (n – 1) • fact will not loop forever for a negative argument! sub n | n < 10 = 0 | n > 100 = 2 | otherwise = 1 UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Local scope: where quadratic_root a b c = [minus_b_over_2a – root_part_over_2a, minus_b_over_2a + root_part_over_2a] where minus_b_over_2a = -b / (2.0 * a) root_part_over_2a = sqrt(b ^ 2 – 4.0 * a * c) / (2.0 * a) UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering List comprehensions, generators, and tests • List comprehensions are used to define lists that represent sets, using a notation similar to traditional set notation: [body | qualifiers], e.g., [n * n * n | n <- [1..50]] defines a list of cubes of the numbers from 1 to 50 • Qualifiers can be generators (as above) or tests • The following function returns the list of factors of n factors n = [i | i <- [1 .. n div 2], n mod i == 0] UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering A Taste of Haskell f [] = [] f (x:xs) = f ys ++ [x] ++ f zs where ys = [a | a xs, a x] zs = [b | b xs, b > x] UNIVERSITY OF SOUTH CAROLINA ? 13 Department of Computer Science and Engineering 13 Quicksort The quicksort algorithm for sorting a list of integers can be specified by the following two rules: • The empty list is already sorted; • Non-empty lists can be sorted by sorting the tail values the head, sorting the tail values the head, and then appending the resulting lists on either side of the head value. UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering Using recursion, this specification can be translated directly into an implementation: qsort :: [Int] [Int] qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a xs, a x] larger = [b | b xs, b x] Note: • This is probably the simplest implementation of quicksort in any programming language! UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering For example (abbreviating qsort as q): q [3,2,4,1,5] q [2,1] ++ [3] ++ q [4,5] q [1] ++ [2] ++ q [] [1] [] UNIVERSITY OF SOUTH CAROLINA q [] ++ [4] ++ q [5] [] [5] Department of Computer Science and Engineering Lazy evaluation • Lazy evaluation allows infinite data structures, e.g.: positives = [0 ..] squares = [n * n | n <- [0..]] • member squares 16 • member [] b = False member (a:x) b = (a == b) || member x b • member2 (m:x) n | m < n = member2 x n | m == n true otherwise = False UNIVERSITY OF SOUTH CAROLINA Department of Computer Science and Engineering

Descargar
# Document