Introduction to Functional Programming
Total Page:16
File Type:pdf, Size:1020Kb
Load more
Recommended publications
-
Confusion in the Church-Turing Thesis Has Obscured the Funda- Mental Limitations of Λ-Calculus As a Foundation for Programming Languages
Confusion in the Church-Turing Thesis Barry Jay and Jose Vergara University of Technology, Sydney {Barry.Jay,Jose.Vergara}@uts.edu.au August 20, 2018 Abstract The Church-Turing Thesis confuses numerical computations with sym- bolic computations. In particular, any model of computability in which equality is not definable, such as the λ-models underpinning higher-order programming languages, is not equivalent to the Turing model. However, a modern combinatory calculus, the SF -calculus, can define equality of its closed normal forms, and so yields a model of computability that is equivalent to the Turing model. This has profound implications for pro- gramming language design. 1 Introduction The λ-calculus [17, 4] does not define the limit of expressive power for higher- order programming languages, even when they are implemented as Turing ma- chines [69]. That this seems to be incompatible with the Church-Turing Thesis is due to confusion over what the thesis is, and confusion within the thesis itself. According to Soare [63, page 11], the Church-Turing Thesis is first mentioned in Steven Kleene’s book Introduction to Metamathematics [42]. However, the thesis is never actually stated there, so that each later writer has had to find their own definition. The main confusions within the thesis can be exposed by using the book to supply the premises for the argument in Figure 1 overleaf. The conclusion asserts the λ-definability of equality of closed λ-terms in normal form, i.e. syntactic equality of their deBruijn representations [20]. Since the conclusion is false [4, page 519] there must be a fault in the argument. -
Functional Languages
Functional Programming Languages (FPL) 1. Definitions................................................................... 2 2. Applications ................................................................ 2 3. Examples..................................................................... 3 4. FPL Characteristics:.................................................... 3 5. Lambda calculus (LC)................................................. 4 6. Functions in FPLs ....................................................... 7 7. Modern functional languages...................................... 9 8. Scheme overview...................................................... 11 8.1. Get your own Scheme from MIT...................... 11 8.2. General overview.............................................. 11 8.3. Data Typing ...................................................... 12 8.4. Comments ......................................................... 12 8.5. Recursion Instead of Iteration........................... 13 8.6. Evaluation ......................................................... 14 8.7. Storing and using Scheme code ........................ 14 8.8. Variables ........................................................... 15 8.9. Data types.......................................................... 16 8.10. Arithmetic functions ......................................... 17 8.11. Selection functions............................................ 18 8.12. Iteration............................................................. 23 8.13. Defining functions ........................................... -
Lambda Calculus Encodings
CMSC 330: Organization of Programming Languages Lambda Calculus Encodings CMSC330 Fall 2017 1 The Power of Lambdas Despite its simplicity, the lambda calculus is quite expressive: it is Turing complete! Means we can encode any computation we want • If we’re sufficiently clever... Examples • Booleans • Pairs • Natural numbers & arithmetic • Looping 2 Booleans Church’s encoding of mathematical logic • true = λx.λy.x • false = λx.λy.y • if a then b else c Ø Defined to be the expression: a b c Examples • if true then b else c = (λx.λy.x) b c → (λy.b) c → b • if false then b else c = (λx.λy.y) b c → (λy.y) c → c 3 Booleans (cont.) Other Boolean operations • not = λx.x false true Ø not x = x false true = if x then false else true Ø not true → (λx.x false true) true → (true false true) → false • and = λx.λy.x y false Ø and x y = if x then y else false • or = λx.λy.x true y Ø or x y = if x then true else y Given these operations • Can build up a logical inference system 4 Quiz #1 What is the lambda calculus encoding of xor x y? - xor true true = xor false false = false - xor true false = xor false true = true A. x x y true = λx.λy.x B. x (y true false) y false = λx.λy.y C. x (y false true) y if a then b else c = a b c not = λx.x false true D. y x y 5 Quiz #1 What is the lambda calculus encoding of xor x y? - xor true true = xor false false = false - xor true false = xor false true = true A. -
The Machine That Builds Itself: How the Strengths of Lisp Family
Khomtchouk et al. OPINION NOTE The Machine that Builds Itself: How the Strengths of Lisp Family Languages Facilitate Building Complex and Flexible Bioinformatic Models Bohdan B. Khomtchouk1*, Edmund Weitz2 and Claes Wahlestedt1 *Correspondence: [email protected] Abstract 1Center for Therapeutic Innovation and Department of We address the need for expanding the presence of the Lisp family of Psychiatry and Behavioral programming languages in bioinformatics and computational biology research. Sciences, University of Miami Languages of this family, like Common Lisp, Scheme, or Clojure, facilitate the Miller School of Medicine, 1120 NW 14th ST, Miami, FL, USA creation of powerful and flexible software models that are required for complex 33136 and rapidly evolving domains like biology. We will point out several important key Full list of author information is features that distinguish languages of the Lisp family from other programming available at the end of the article languages and we will explain how these features can aid researchers in becoming more productive and creating better code. We will also show how these features make these languages ideal tools for artificial intelligence and machine learning applications. We will specifically stress the advantages of domain-specific languages (DSL): languages which are specialized to a particular area and thus not only facilitate easier research problem formulation, but also aid in the establishment of standards and best programming practices as applied to the specific research field at hand. DSLs are particularly easy to build in Common Lisp, the most comprehensive Lisp dialect, which is commonly referred to as the “programmable programming language.” We are convinced that Lisp grants programmers unprecedented power to build increasingly sophisticated artificial intelligence systems that may ultimately transform machine learning and AI research in bioinformatics and computational biology. -
Functional Programming Laboratory 1 Programming Paradigms
Intro 1 Functional Programming Laboratory C. Beeri 1 Programming Paradigms A programming paradigm is an approach to programming: what is a program, how are programs designed and written, and how are the goals of programs achieved by their execution. A paradigm is an idea in pure form; it is realized in a language by a set of constructs and by methodologies for using them. Languages sometimes combine several paradigms. The notion of paradigm provides a useful guide to understanding programming languages. The imperative paradigm underlies languages such as Pascal and C. The object-oriented paradigm is embodied in Smalltalk, C++ and Java. These are probably the paradigms known to the students taking this lab. We introduce functional programming by comparing it to them. 1.1 Imperative and object-oriented programming Imperative programming is based on a simple construct: A cell is a container of data, whose contents can be changed. A cell is an abstraction of a memory location. It can store data, such as integers or real numbers, or addresses of other cells. The abstraction hides the size bounds that apply to real memory, as well as the physical address space details. The variables of Pascal and C denote cells. The programming construct that allows to change the contents of a cell is assignment. In the imperative paradigm a program has, at each point of its execution, a state represented by a collection of cells and their contents. This state changes as the program executes; assignment statements change the contents of cells, other statements create and destroy cells. Yet others, such as conditional and loop statements allow the programmer to direct the control flow of the program. -
171 Composition Operator on the Space of Functions
Acta Math. Univ. Comenianae 171 Vol. LXXXI, 2 (2012), pp. 171{183 COMPOSITION OPERATOR ON THE SPACE OF FUNCTIONS TRIEBEL-LIZORKIN AND BOUNDED VARIATION TYPE M. MOUSSAI Abstract. For a Borel-measurable function f : R ! R satisfying f(0) = 0 and Z sup t−1 sup jf 0(x + h) − f 0(x)jp dx < +1; (0 < p < +1); t>0 R jh|≤t s n we study the composition operator Tf (g) := f◦g on Triebel-Lizorkin spaces Fp;q(R ) in the case 0 < s < 1 + (1=p). 1. Introduction and the main result The study of the composition operator Tf : g ! f ◦ g associated to a Borel- s n measurable function f : R ! R on Triebel-Lizorkin spaces Fp;q(R ), consists in finding a characterization of the functions f such that s n s n (1.1) Tf (Fp;q(R )) ⊆ Fp;q(R ): The investigation to establish (1.1) was improved by several works, for example the papers of Adams and Frazier [1,2 ], Brezis and Mironescu [6], Maz'ya and Shaposnikova [9], Runst and Sickel [12] and [10]. There were obtained some necessary conditions on f; from which we recall the following results. For s > 0, 1 < p < +1 and 1 ≤ q ≤ +1 n s n s n • if Tf takes L1(R ) \ Fp;q(R ) to Fp;q(R ), then f is locally Lipschitz con- tinuous. n s n • if Tf takes the Schwartz space S(R ) to Fp;q(R ), then f belongs locally to s Fp;q(R). The first assertion is proved in [3, Theorem 3.1]. -
Functional and Imperative Object-Oriented Programming in Theory and Practice
Uppsala universitet Inst. för informatik och media Functional and Imperative Object-Oriented Programming in Theory and Practice A Study of Online Discussions in the Programming Community Per Jernlund & Martin Stenberg Kurs: Examensarbete Nivå: C Termin: VT-19 Datum: 14-06-2019 Abstract Functional programming (FP) has progressively become more prevalent and techniques from the FP paradigm has been implemented in many different Imperative object-oriented programming (OOP) languages. However, there is no indication that OOP is going out of style. Nevertheless the increased popularity in FP has sparked new discussions across the Internet between the FP and OOP communities regarding a multitude of related aspects. These discussions could provide insights into the questions and challenges faced by programmers today. This thesis investigates these online discussions in a small and contemporary scale in order to identify the most discussed aspect of FP and OOP. Once identified the statements and claims made by various discussion participants were selected and compared to literature relating to the aspects and the theory behind the paradigms in order to determine whether there was any discrepancies between practitioners and theory. It was done in order to investigate whether the practitioners had different ideas in the form of best practices that could influence theories. The most discussed aspect within FP and OOP was immutability and state relating primarily to the aspects of concurrency and performance. This thesis presents a selection of representative quotes that illustrate the different points of view held by groups in the community and then addresses those claims by investigating what is said in literature. -
Functional Javascript
www.it-ebooks.info www.it-ebooks.info Functional JavaScript Michael Fogus www.it-ebooks.info Functional JavaScript by Michael Fogus Copyright © 2013 Michael Fogus. All rights reserved. Printed in the United States of America. Published by O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472. O’Reilly books may be purchased for educational, business, or sales promotional use. Online editions are also available for most titles (http://my.safaribooksonline.com). For more information, contact our corporate/ institutional sales department: 800-998-9938 or [email protected]. Editor: Mary Treseler Indexer: Judith McConville Production Editor: Melanie Yarbrough Cover Designer: Karen Montgomery Copyeditor: Jasmine Kwityn Interior Designer: David Futato Proofreader: Jilly Gagnon Illustrator: Robert Romano May 2013: First Edition Revision History for the First Edition: 2013-05-24: First release See http://oreilly.com/catalog/errata.csp?isbn=9781449360726 for release details. Nutshell Handbook, the Nutshell Handbook logo, and the O’Reilly logo are registered trademarks of O’Reilly Media, Inc. Functional JavaScript, the image of an eider duck, and related trade dress are trademarks of O’Reilly Media, Inc. Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and O’Reilly Media, Inc., was aware of a trade‐ mark claim, the designations have been printed in caps or initial caps. While every precaution has been taken in the preparation of this book, the publisher and author assume no responsibility for errors or omissions, or for damages resulting from the use of the information contained herein. -
Comparative Programming Languages
CSc 372 Comparative Programming Languages 10 : Haskell — Curried Functions Department of Computer Science University of Arizona [email protected] Copyright c 2013 Christian Collberg 1/22 Infix Functions Declaring Infix Functions Sometimes it is more natural to use an infix notation for a function application, rather than the normal prefix one: 5+6 (infix) (+) 5 6 (prefix) Haskell predeclares some infix operators in the standard prelude, such as those for arithmetic. For each operator we need to specify its precedence and associativity. The higher precedence of an operator, the stronger it binds (attracts) its arguments: hence: 3 + 5*4 ≡ 3 + (5*4) 3 + 5*4 6≡ (3 + 5) * 4 3/22 Declaring Infix Functions. The associativity of an operator describes how it binds when combined with operators of equal precedence. So, is 5-3+9 ≡ (5-3)+9 = 11 OR 5-3+9 ≡ 5-(3+9) = -7 The answer is that + and - associate to the left, i.e. parentheses are inserted from the left. Some operators are right associative: 5^3^2 ≡ 5^(3^2) Some operators have free (or no) associativity. Combining operators with free associativity is an error: 5==4<3 ⇒ ERROR 4/22 Declaring Infix Functions. The syntax for declaring operators: infixr prec oper -- right assoc. infixl prec oper -- left assoc. infix prec oper -- free assoc. From the standard prelude: infixl 7 * infix 7 /, ‘div‘, ‘rem‘, ‘mod‘ infix 4 ==, /=, <, <=, >=, > An infix function can be used in a prefix function application, by including it in parenthesis. Example: ? (+) 5 ((*) 6 4) 29 5/22 Multi-Argument Functions Multi-Argument Functions Haskell only supports one-argument functions. -
Functional Programming Lecture 1: Introduction
Functional Programming Lecture 13: FP in the Real World Viliam Lisý Artificial Intelligence Center Department of Computer Science FEE, Czech Technical University in Prague [email protected] 1 Mixed paradigm languages Functional programming is great easy parallelism and concurrency referential transparency, encapsulation compact declarative code Imperative programming is great more convenient I/O better performance in certain tasks There is no reason not to combine paradigms 2 3 Source: Wikipedia 4 Scala Quite popular with industry Multi-paradigm language • simple parallelism/concurrency • able to build enterprise solutions Runs on JVM 5 Scala vs. Haskell • Adam Szlachta's slides 6 Is Java 8 a Functional Language? Based on: https://jlordiales.me/2014/11/01/overview-java-8/ Functional language first class functions higher order functions pure functions (referential transparency) recursion closures currying and partial application 7 First class functions Previously, you could pass only classes in Java File[] directories = new File(".").listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory(); } }); Java 8 has the concept of method reference File[] directories = new File(".").listFiles(File::isDirectory); 8 Lambdas Sometimes we want a single-purpose function File[] csvFiles = new File(".").listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getAbsolutePath().endsWith("csv"); } }); Java 8 has lambda functions for that File[] csvFiles = new File(".") -
Making a Faster Curry with Extensional Types
Making a Faster Curry with Extensional Types Paul Downen Simon Peyton Jones Zachary Sullivan Microsoft Research Zena M. Ariola Cambridge, UK University of Oregon [email protected] Eugene, Oregon, USA [email protected] [email protected] [email protected] Abstract 1 Introduction Curried functions apparently take one argument at a time, Consider these two function definitions: which is slow. So optimizing compilers for higher-order lan- guages invariably have some mechanism for working around f1 = λx: let z = h x x in λy:e y z currying by passing several arguments at once, as many as f = λx:λy: let z = h x x in e y z the function can handle, which is known as its arity. But 2 such mechanisms are often ad-hoc, and do not work at all in higher-order functions. We show how extensional, call- It is highly desirable for an optimizing compiler to η ex- by-name functions have the correct behavior for directly pand f1 into f2. The function f1 takes only a single argu- expressing the arity of curried functions. And these exten- ment before returning a heap-allocated function closure; sional functions can stand side-by-side with functions native then that closure must subsequently be called by passing the to practical programming languages, which do not use call- second argument. In contrast, f2 can take both arguments by-name evaluation. Integrating call-by-name with other at once, without constructing an intermediate closure, and evaluation strategies in the same intermediate language ex- this can make a huge difference to run-time performance in presses the arity of a function in its type and gives a princi- practice [Marlow and Peyton Jones 2004]. -
Modular Domain-Specific Language Components in Scala
Submitted to GPCE ’10 Modular Domain-Specific Language Components in Scala Christian Hofer Klaus Ostermann Aarhus University, Denmark University of Marburg, Germany [email protected] [email protected] Abstract simply compose these languages, if the concrete representations of Programs in domain-specific embedded languages (DSELs) can be their types in the host language match. Assuming Scala as our host represented in the host language in different ways, for instance im- language, we can then write a term like: plicitly as libraries, or explicitly in the form of abstract syntax trees. app(lam((x: Region) )union(vr(x),univ)), Each of these representations has its own strengths and weaknesses. scale(circle(3), The implicit approach has good composability properties, whereas add(vec(1,2),vec(3,4)))) the explicit approach allows more freedom in making syntactic pro- This term applies a function which maps a region to its union with gram transformations. the universal region to a circle that is scaled by a vector. Traditional designs for DSELs fix the form of representation, However, the main advantage of this method is also its main which means that it is not possible to choose the best representation disadvantage. It restricts the implementation to a fixed interpreta- for a particular interpretation or transformation. We propose a new tion which has to be compositional, i. e., the meaning of an expres- design for implementing DSELs in Scala which makes it easy to sion may only depend only on the meaning of its sub-expressions, use different program representations at the same time.