1 / 13

Comp 205: Comparative Programming Languages

Comp 205: Comparative Programming Languages. Functional Programming Languages: More Lists Recursive definitions List comprehensions Lecture notes, exercises, etc., can be found at: www.csc.liv.ac.uk/~grant/Teaching/COMP205/. Recursion. The type of lists is “recursively defined”:

lavender
Download Presentation

Comp 205: Comparative Programming Languages

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Comp 205:Comparative Programming Languages • Functional Programming Languages: • More Lists • Recursive definitions • List comprehensions • Lecture notes, exercises, etc., can be found at: • www.csc.liv.ac.uk/~grant/Teaching/COMP205/

  2. Recursion • The type of lists is “recursively defined”: • A list is either: • empty, or • is an element followed by a list • Many function definitions follow this pattern: length [] = 0 unzip (x : xs) = 1 + length xs

  3. Recursion Compute the sum of all the numbers in a list: sumAll :: [Integer] -> Integer The sum of all the numbers in the empty list is 0: sumAll [] = 0 The sum of all the numbers in a list x : xs is x + the sum of all the numbers in xs: sumAll (x : xs) = x + sumAll xs

  4. Recursion Concatenate all the strings in a list of strings: concat :: [[Char]] -> [Char] Concatenating all the strings in the empty list gives the empty string: concat [] = [] --- = “” Concatenating all the strings in a list s : ss is s appended to the concatenation of all the strings in ss: concat (s : ss) = s ++ concat ss

  5. Patterns Patterns can be combined: zip :: [Int] -> [String] -> [(Int,String)] zip [] ss = [] zip is [] = [] zip (i:is) (s:ss) = (i,s) : zip is ss

  6. More Patterns Patterns can be complex: unzip [] = [] unzip ((x,y) : ps) = (x:xs, y:ys) where (xs,ys) = unzip ps

  7. List Comprehensions Haskell (and other languages like Miranda) provides a special notation for constructing new lists from old: suppose xs = [1,2,3,4,5,6], then [ 2*x | x <- xs ] is the list [2,4,6,8,10,12].

  8. Some Terminology [ E | P <- LExp ] body selector

  9. List Comprehensions The selector can contain a pattern rather than simply a variable. For example, a function to add each pair in a List of pairs of numbers: addAll :: [(Int,Int)] -> [Int] addAll ps = [ x+y | (x,y) <- ps ]

  10. List Comprehensions The selector can be combined with one or more guards, separated by commas: Main> [ 2*x | x<-[1..6], even x, x<5 ] [4,8] since the only elements of [1..6] that satisfy the guards are 2 and 4.

  11. List Comprehensions More than one selector can be used: [ (x,y) | x <- [1,2,3], y <- [5,6] ] denotes the list [ (1,5), (1,6), (2,5), (2,6), (3,5), (3,6) ]

  12. List Comprehensions List comprehensions are expressions, so they can be used in definitions: coords :: [(Int,Int)] coords = [ (x,y) | x<-[0..9], y<-[0..9]] mkCoords :: [Int] -> [Int] -> [(Int,Int)] mkCoords xs ys = [ (x,y) | x <- xs, y <- ys ]

  13. Summary • Key topics: • Recursion • List Comprehensions • Next: Higher-Order Functions

More Related