Curry on Functional Programming

Curry on Functional Programming

Welcome! 2019 Victor Ciura | @ciura_victor !1 Open4Tech Summer School 2019 http://inf.ucv.ro/~summer-school/ https://www.caphyon.ro/open4tech-2019.html 2019 Victor Ciura | @ciura_victor !2 Curry On Functional Programming July, 2019 Craiova Victor Ciura @ciura_victor Technical Lead, Caphyon www.caphyon.ro Abstract Can a language whose official motto is “Avoid Success at All Costs” teach us new tricks in modern programming languages? If Haskell is so great, why hasn't it taken over the world? My claim is that it has. But not as a Roman legion loudly marching in a new territory, rather as distributed Trojan horses popping in at the gates, masquerading as modern features or novel ideas in today’s mainstream languages. Functional Programming ideas that have been around for over 40 years will be rediscovered to solve our current software complexity problems. Indeed, modern programming languages have become more functional. From mundane concepts like lambdas & closures, function objects, values types and constants, to composability of algorithms, ranges, folding, mapping or even higher-order functions. In this workshop we’ll analyze a bunch of FP techniques and see how they help make our code shorter, clearer and faster, by embracing a declarative vs. an imperative style. Brace yourselves for a bumpy ride including composition, lifting, currying, partial application, pure functions, maybe even pattern matching and lazy evaluation. Spoiler: no unicorns here. 2019 Victor Ciura | @ciura_victor !X Who Am I ? Advanced Installer Clang Power Tools @ciura_victor 2019 Victor Ciura | @ciura_victor !4 Curry On Functional Programming What is it all about ? � 2019 Victor Ciura | @ciura_victor !5 Haskell ranges std::optional C++ algorithms STL Maybe | Just lifting lambdas & closures monoids fold values types lazy evaluation declarative vs imperative monads algebraic data types higher order functions map composition pattern matching FP expressions vs statements pure functions currying category theory partial application recursion 2019 Victor Ciura | @ciura_victor !6 Paradox of Programming Machine/Human impedance mismatch: Local/Global perspective Progress/Goal oriented Detail/Idea Vast/Limited memory Pretty reliable/Error prone Machine language/Mathematics Is it easier to think like a machine than to do math? A Crash Course in Category Theory - Bartosz Milewski https://www.youtube.com/watch?v=JH_Ou17_zyU 2019 Victor Ciura | @ciura_victor !7 Semantics The meaning of a program Operational semantics: local, progress oriented • Execute program on an abstract machine in your brain Denotational semantics • Translate program to math Math: an ancient language developed for humans A Crash Course in Category Theory - Bartosz Milewski https://www.youtube.com/watch?v=JH_Ou17_zyU 2019 Victor Ciura | @ciura_victor !8 What is Functional Programming ? • Functional programming is a 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 2019 Victor Ciura | @ciura_victor !9 Let's address the � in the room... Haskell 2019 Victor Ciura | @ciura_victor !10 https://www.amazon.com/Programming-Haskell-Graham-Hutton/dp/1316626229/ 2019 Victor Ciura | @ciura_victor !11 A functional language is one that supports and encourages the functional style What do you mean ? 2019 Victor Ciura | @ciura_victor !12 Summing the integers 1 to 10 in C++/Java/C# int total = 0; for (int i = 1; i ≤ 10; i++) total = total + i; The computation method is variable assignment. 2019 Victor Ciura | @ciura_victor !13 Summing the integers 1 to 10 in Haskell sum [1..10] The computation method is function application. 2019 Victor Ciura | @ciura_victor !14 Sneak Peek Into Next Level QA (Test Automation) - Antonio Valent 2019 Victor Ciura | @ciura_victor !15 Historical Background 2019 Victor Ciura | @ciura_victor !16 Historical Background Most of the "new" ideas and innovations in modern programming languages are actually very old... 2019 Victor Ciura | @ciura_victor !17 Historical Background 1930s Alonzo Church develops the lambda calculus, a simple but powerful theory of functions 2019 Victor Ciura | @ciura_victor !18 Historical Background 1950s John McCarthy develops Lisp, the first functional language, with some influences from the lambda calculus, but retaining variable assignments 2019 Victor Ciura | @ciura_victor !19 Historical Background 1960s Peter Landin develops ISWIM, the first pure functional language, based strongly on the lambda calculus, with no assignments 2019 Victor Ciura | @ciura_victor !20 Historical Background 1970s John Backus develops FP, a functional language that emphasizes higher-order functions and reasoning about programs 2019 Victor Ciura | @ciura_victor !21 Historical Background 1970s Robin Milner and others develop ML, the first modern functional language, which introduced type inference and polymorphic types 2019 Victor Ciura | @ciura_victor !22 Historical Background 1970-80s David Turner develops a number of lazy functional languages, culminating in the Miranda system 2019 Victor Ciura | @ciura_victor !23 Historical Background 1987 An international committee starts the development of Haskell, a standard lazy functional language 2019 Victor Ciura | @ciura_victor !24 Historical Background 1990s Phil Wadler and others develop type classes and monads, two of the main innovations of Haskell 2019 Victor Ciura | @ciura_victor !25 Historical Background 2003 2010 The committee publishes the Haskell Report, defining a stable version of the language; an updated version was published in 2010 2019 Victor Ciura | @ciura_victor !26 Historical Background 2010-2019 standard distribution library support new language features development tools use in industry influence on other languages 2019 Victor Ciura | @ciura_victor !27 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] What does f do ? 2019 Victor Ciura | @ciura_victor !28 Standard Prelude Haskell comes with a large number of standard library functions Select the first element of a list: > head [1,2,3,4,5] 1 Remove the first element from a list: > tail [1,2,3,4,5] [2,3,4,5] 2019 Victor Ciura | @ciura_victor !29 Standard Prelude Select the nth element of a list: > [1,2,3,4,5] !! 2 3 Select the first n elements of a list: > take 3 [1,2,3,4,5] [1,2,3] 2019 Victor Ciura | @ciura_victor !30 Standard Prelude Remove the first n elements from a list: > drop 3 [1,2,3,4,5] [4,5] Calculate the length of a list: > length [1,2,3,4,5] 5 Calculate the sum of a list of numbers: > sum [1,2,3,4,5] 15 2019 Victor Ciura | @ciura_victor !31 Standard Prelude Calculate the product of a list of numbers: > product [1,2,3,4,5] 120 Append two lists: > [1,2,3] ++ [4,5] [1,2,3,4,5] Reverse a list: > reverse [1,2,3,4,5] [5,4,3,2,1] 2019 Victor Ciura | @ciura_victor !32 Function Application f a b + c*d f applied to a and b Function application is assumed to have higher priority than all other operators: f a + b means (f a) + b rather than f (a + b) 2019 Victor Ciura | @ciura_victor !33 Function Application Mathematics Haskell f(x) f x f(x,y) f x y f(g(x)) f (g x) f(x,g(y)) f x (g y) f(x) g(y) f x * g y 2019 Victor Ciura | @ciura_victor !34 My First Function double x = x + x quadruple x = double (double x) > quadruple 10 40 > take (double 2) [1,2,3,4,5,6] [1,2,3,4] 2019 Victor Ciura | @ciura_victor !35 Infix Functions average ns = sum ns `div` length ns x `f` y is just syntactic sugar for f x y 2019 Victor Ciura | @ciura_victor !36 The Layout Rule The layout rule avoids the need for explicit syntax to indicate the grouping of definitions a = b + c a = b + c where where b = 1 means {b = 1; c = 2 c = 2} d = a * 2 d = a * 2 implicit grouping explicit grouping 2019 Victor Ciura | @ciura_victor !37 Types in Haskell If evaluating an expression e would produce a value of type t, then e has type t, written as e::t Every well formed expression has a type, which can be automatically calculated at compile time using a process called type inference All type errors are found at compile time, => makes programs safer and faster by removing the need for type checks at run time 2019 Victor Ciura | @ciura_victor !38 List Types A list is sequence of values of the same type: [False,True,False] :: [Bool] [’a’,’b’,’c’,’d’] :: [Char] [[’a’],[’b’,’c’]] :: [[Char]] 2019 Victor Ciura | @ciura_victor !39 Tuple Types (False,True) :: (Bool,Bool) (False,’a’,True) :: (Bool,Char,Bool) (’a’,(False,’b’)) :: (Char,(Bool,Char)) (True,[’a’,’b’]) :: (Bool,[Char]) 2019 Victor Ciura | @ciura_victor !40 Function Types A function is a mapping from values of one type to values of another type: not :: Bool " Bool even :: Int " Bool 2019 Victor Ciura | @ciura_victor !41 Function Types add :: (Int,Int) " Int add (x,y) = x+y zeroto :: Int " [Int] zeroto n = [0..n] 2019 Victor Ciura | @ciura_victor !42 Curried Functions Functions with multiple arguments are also possible by returning functions as results: add’ :: Int " (Int " Int) add’ x y = x+y add’ takes an integer x and returns a function add’ x In turn, this new function takes an integer y and returns the result x+y 2019 Victor Ciura | @ciura_victor !43 Curried Functions add and add’ produce the same final result, but add takes its two arguments at the same time, whereas add’ takes them one at a time: add :: (Int,Int) " Int add’ :: Int " (Int " Int) Functions that take their arguments one at a time are called curried functions, celebrating the work of Haskell Curry on such functions. 2019 Victor Ciura | @ciura_victor !44 Curried Functions Functions with more than two arguments can be curried by returning nested functions: mult :: Int " (Int " (Int " Int)) mult x y z = x*y*z mult takes an integer x and returns a function mult x, which in turn takes an integer y and returns a function mult x y, which finally takes an integer z and returns the result x*y*z 2019 Victor Ciura | @ciura_victor !45 Curried Functions Curried functions are more flexible than functions on tuples, because useful functions can often be made by partially applying a curried function.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    139 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