Type-indexed functions in Generic Haskell

Size: px
Start display at page:

Download "Type-indexed functions in Generic Haskell"

Transcription

1 Type-indexed functions in Generic Haskell Johan Jeuring September 15, 2004

2 Introduction Today I will talk about: a Types of polymorphism. b Type-indexed functions. c Dependencies. Read about b, and c in Exploring Generic haskell, Sections and Chapter 5. 2 / 33

3 Types of polymorphism Most modern programming languages support one or more forms of polymorphism: parametric polymorphism, ad hoc polymorphism or overloading, subtype polymorphism, generic polymorphism or polytypism. Some, such as Generic Java, C++, Haskell, support more than one. 3 / 33

4 Parametric polymorphism Parametric polymorphic functions work on any type in a uniform (parametric) manner for each type. flatten :: a.[[a]] [a] id :: a.a a map :: a b.(a b) [a] [b] foldl :: a b.(a b a) a [b] a 4 / 33

5 Ad hoc polymorphism or Overloading Haskell uses type classes for ad hoc polymorphism. You can write both and class Num a where (+) :: a a a... There is not necessarily any relationship between the different instances of the type class, hence the name ad hoc. Java s overloading is another example: same method name, but different argument types. Ad hoc polymorphism is statically resolved. 5 / 33

6 Subtype Polymorphism Dynamic dispatch in, for example, Java: Calling the draw method on a variable of type Shape will work for objects from type Circle, Square, etc. Objects to which the method can apply are related by subtyping (often by subclassing also). Multimethods extend Java overloading dispatch is dynamically resolved. Implemented in Multijava, Cecil. Thus subtype polymorphism (in OO) can be seen as the dynamic version of overloading. 6 / 33

7 Generic polymorphism or polytypism Some functions do essentially the same thing for different data types, but you still have to write instances on the data types. An example is the equality function. Often the behaviour depends upon the structure of type of the input. Since we are dealing with Haskell, we focus only on parametric polymorphism with an aim to extending it with generic polymorphism. 7 / 33

8 Parametricity Function length is parametrically polymorphic. Its operation is insensitive to the list s element type: the list elements are not inspected. length :: a.[a] Int length [ ] = 0 length (x : xs) = 1 + length xs 8 / 33

9 Parametric polymorphism: limitations Polymorphic type systems are less flexible than desired. If eq has the following type: equal :: a.a a Bool -- doesn t work then equal must be constant the arguments cannot be inspected. A programmer has to write an instance of equal for each type. With the help of class system: equal :: a.(eq a) a a Bool But this does not work for some (higher-order) data types. Generic Haskell aims to get around these problems. 9 / 33

10 Generic programming Many programs work in essentially the same way on different data types: Summing all integers, or collecting all values in a data structure. Printing and parsing values. Map. A generic program is written once, but works for many different data types maybe even of all kinds. Generic programming adds considerable expressive power to a polymorphic type system. 10 / 33

11 Type-indexed functions Our approach: a type-indexed function takes a type as argument, and can be defined inductively on the structure of the type. In ordinary programming we define values depending on values (called functions), and types depending (parametrically) on types (called type constructors). Generic programming adds the possibility of defining values depending on types (called type-indexed values), and types depending on kinds (called kind-indexed types). Type safety is not compromised. 11 / 33

12 Function add Lets define an addition function for some useful types. add Bool = ( ) add Int = (+) add Char x y = chr (ord x + ord y) The type of add is a :: a a a Or, to emphasize that add is a type-indexed function: add a :: :: a a a 12 / 33

13 Calling function add The type of add says that the function can be called by providing three arguments: a type, and two arguments of that type. Indeed, the calls add Bool False True add Int 2 7 add Char A would evaluate to True, 9, and a respectively. 13 / 33

14 What about generic programming? Being able to define functions on types is basically the same as defining instances of a class. So why not use classes? Advantages of classes: you can always add new instances, and you don t have to provide a type argument when calling a class method. And what is the relation with generic programming? In the next lecture we will show how any data type can be translated to a small set of data types. If we then define a type-indexed function on the elements of this small set of data types, it can automatically be used on any other data type. 14 / 33

15 Data types and kinds Consider the following data types: data Bool = True False data Nat = Zero Succ Nat data IntList = INil ICons Int IntList These types are basic types of kind. The following types have kind : data List a = Nil Cons a (List a) data [a] = [ ] a : [a] data Maybe a = Nothing Just a 15 / 33

16 Kinds The type of a data type is given by a kind. Kinds have two forms: κ ::= -- the kind of types κ ν -- function kind Here are some data types with more advanced kinds: data Rose a = Node a [Rose a] ex :: Rose String ex = Node "A" [Node "rose" [ ], Node "is" [ ],...] data GRose f a = GNode a (f (GRose f a)) ex :: GRose [ ] Int ex = GNode 3 [GNode 10 [ ], GNode 2 [ ],...] 16 / 33

17 Question What is the kind of Sum? data Sum a b = Inl a Inr b a b ( ) c ( ) ( ) ( ) d 17 / 33

18 Question What is the kind of Fix? data Fix f = In (f (Fix f)) a b ( ) c ( ) d 18 / 33

19 add on Maybe A problem with the definition of add is that it can only be applied to types of kind, but we also want it to work for on types of kinds other than. Given that we know how to add two values of some type t, we can also add two values of type Maybe t, by treating Nothing as exceptional value: add Maybe α Nothing = Nothing add Maybe α Nothing = Nothing add Maybe α (Just x) (Just y) = Just (add α x y) The knowledge of how to add two values of the argument type of Maybe is hidden in the reference to add α in the final case, and we still have to make sure that we get access to that information somehow. 19 / 33

20 add on types of other kinds We could also extend the function add to lists as pointwise addition: add [α ] x y length x length y = map (uncurry (add α )) (zip x y) otherwise = error "args must have same length" We do not even have to restrict ourselves to kind and data types. We can do pointwise addition for pairs, too: add (α, β) (x1, x2) (y1, y2) = (add α x1 y1, add β x2 y2) Now our function add has arms which involve type constructors of kinds,, and, all at the same time. 20 / 33

21 Requirements To be able to implement add as above, we need (at least) two extensions of the current situation: Type patterns must become more general. Instead of just named types of kind, we will admit named types of arbitrary kind, applied to type variables in such a way that the resulting type is of kind again. We need to introduce the notion of dependencies between type-indexed functions. A dependency arises if in the definition of one type-indexed function, another type-indexed function (including the function itself) is called, with a variable type as type argument. 21 / 33

22 Parameterized type patterns We now allow patterns such as [α ] or Either α β in the definitions of type-indexed functions. A pattern must be of kind, and of the form that a named type constructor is applied to variables to satisfy the type constructor. For example. Either α is not allowed because Either is only partially applied. All type variables in type patterns have to be distinct, just as we require variables in ordinary patterns to be distinct. A pattern such as (α,α) is illegal. We do not allow nested type patterns: [Int] is forbidden, and so is Either α Char. The top-level type constructor is the only named type occurring in a type pattern, the rest are all type variables. This restriction on type patterns is not essential. 22 / 33

23 Dependencies Consider the definition of add on lists again: add [α ] x y length x length y = map (uncurry (add α )) (zip x y) otherwise = error "args must have same length" We only know what type α is when add is called on a type somewhere. We say that the function add is a dependency of add. A dependency makes explicit that information is missing. Dependencies of type-indexed functions are reflected in their type signatures. Previously, add had the type add a :: :: a a a This type is no longer adequate we use a new syntax, add a :: :: (add) a a a 23 / 33

24 Type instances of function add I Now, let us look at some example types for specific applications of add: for a constant type argument such as Int, or [Char], the dependencies are ignored, and the types are simply add Int :: Int Int Int add [Char] :: [Char] [Char] [Char] These types are for specific instances of the type-indexed functions, and they can be derived automatically from above type signature. In general, for any type argument A that is dependency-variable free, we have add A :: A A A 24 / 33

25 Type instances of function add II Dependencies have an impact on the type of a generic application once variables occur in the type argument. For instance, if the type argument is [α ], the resulting type is add [α ] :: a ::. (add α :: a a a) [a] [a] [a] We call the part in the parentheses to the left of the double arrow a dependency constraint. In this case, add α :: a a a is a dependency constraint. 25 / 33

26 Type instances of function add III add A :: :: A A A add A (α :: ) :: :: a ::. (add α :: a a a) A a A a A a add A (α :: ) (β :: ) :: :: (a :: ) (b :: ). (add α :: a a a, add β :: b b b) A a b A a b A a b add A (α :: ) :: :: a ::. (add α (γ :: ) :: c ::. (add γ :: c c c) a c a c a c) A a A a A a 26 / 33

27 A function with no dependencies Function size, defined by size [α ] x = length x size Maybe α Nothing = 0 size Maybe α (Just ) = 1 size Tree α Leaf = 0 size Tree α (Node l x r) = size Tree α l size Tree α r where data Tree a = Leaf Node (Tree a) a (Tree a) has no dependencies: size a :: :: a Int 27 / 33

28 A function with different dependencies data CprResult = Less More EqualC NotComparable cpr [α ] x y size [α ] x == size [α ] y = if size [α ] x == 0 then EqualC else let p = zipwith (cpr α ) x y in if allequal [ CprResult] p then head p else NotComparable otherwise = NotComparable cpr (α, β) (x1, x2) (y1, y2) equal α x1 y1 = cpr β x2 y2 otherwise = NotComparable We assume that the type signatures for equal and allequal are as follows: equal a :: :: (equal) a a Bool allequal a :: :: (equal) a Bool 28 / 33

29 Question What is the type of function cpr? a cpr a :: :: (cpr, equal, size, allequal) a a CprResult b cpr a :: :: (cpr, equal, size) a a CprResult c cpr a :: :: (cpr, equal) a a CprResult d cpr a :: :: (cpr) a a CprResult 29 / 33

30 Type instances of function cpr I The type signature is not as fine-grained as one might expect: a dependency is a global property of a type-indexed function, not attached to some arm. Although the arm for lists does not depend on equal, the type for cpr [α ] that is derived from the above type signature exhibits the dependency: cpr [α ] :: a ::. (equal α :: a a Bool, cpr α :: a a CprResult) [a] [a] CprResult 30 / 33

31 Type instances of function cpr II Also, there is no distinction between different dependency variables. The arm for pairs does only depend on cpr for the second component. Nevertheless, the type for cpr α, β contains the dependency on cpr for both components: cpr (α, β) :: a :: (b :: ). (equal α :: a a Bool, cpr α :: a a CprResult, equal β :: b b Bool, cpr β :: b b CprResult) (a, b) (a, b) CprResult 31 / 33

32 Dependencies and classes Dependencies are similar to class constraints in classes. For example, for function add we might define class Add a where add :: a a a An instance of the class for lists would look as follows: instance Add a Add [a] where add x y length x == length y = map (uncurry add) (zip x y) otherwise = error "args must have same length" 32 / 33

33 Conclusions and next lecture Today you have seen: Various forms of polymorphism. Data types and kinds. Type-indexed functions. Types of type-indexed functions. Dependencies between type-indexed functions. In the next lecture I will show how we can use type-indexed functions to obtain generic functions. Furthermore, I will give many examples of generic functions. 33 / 33

Structural polymorphism in Generic Haskell

Structural polymorphism in Generic Haskell Structural polymorphism in Generic Haskell Andres Löh andres@cs.uu.nl 5 February 2005 Overview About Haskell Genericity and other types of polymorphism Examples of generic functions Generic Haskell Overview

More information

CSC324 Principles of Programming Languages

CSC324 Principles of Programming Languages CSC324 Principles of Programming Languages http://mcs.utm.utoronto.ca/~324 November 21, 2018 Last Class Types terminology Haskell s type system Currying Defining types Value constructors Algebraic data

More information

Explicit Recursion in Generic Haskell

Explicit Recursion in Generic Haskell Explicit Recursion in Generic Haskell Andres Löh Universiteit Utrecht andres@cs.uu.nl 26th March 2003 This is joint work with Dave Clarke and Johan Jeuring. Overview What is Generic Haskell? The difference

More information

Advances in Programming Languages

Advances in Programming Languages T O Y H Advances in Programming Languages APL8: Multiparameter Type Classes, Constructor Classes Ian Stark School of Informatics The University of Edinburgh Thursday 4 February Semester 2 Week 4 E H U

More information

Dependencies by case or by function?

Dependencies by case or by function? Dependencies by case or by function? Andres Löh 5 September 2004 Generic equality in Dependency-style Generic functions are defined by pattern matching on a type argument: equal Int = (= =) equal Unit

More information

Overloading, Type Classes, and Algebraic Datatypes

Overloading, Type Classes, and Algebraic Datatypes Overloading, Type Classes, and Algebraic Datatypes Delivered by Michael Pellauer Arvind Computer Science and Artificial Intelligence Laboratory M.I.T. September 28, 2006 September 28, 2006 http://www.csg.csail.mit.edu/6.827

More information

CS 360: Programming Languages Lecture 12: More Haskell

CS 360: Programming Languages Lecture 12: More Haskell CS 360: Programming Languages Lecture 12: More Haskell Geoffrey Mainland Drexel University Adapted from Brent Yorgey s course Introduction to Haskell. Section 1 Administrivia Administrivia Homework 5 due

More information

Comparing Approaches to Generic Programming in Haskell

Comparing Approaches to Generic Programming in Haskell Comparing Approaches to Generic Programming in Haskell Draft lecture notes for the Spring School on Datatype-Generic Programming 2006 Ralf Hinze 1, Johan Jeuring 2, and Andres Löh 1 1 Institut für Informatik

More information

Comparing Approaches to Generic Programming in Haskell

Comparing Approaches to Generic Programming in Haskell Comparing Approaches to Generic Programming in Haskell Ralf Hinze Johan Jeuring Andres Löh Department of Information and Computing Sciences, Utrecht University Technical Report UU-CS-2006-022 www.cs.uu.nl

More information

CS 320: Concepts of Programming Languages

CS 320: Concepts of Programming Languages CS 320: Concepts of Programming Languages Wayne Snyder Computer Science Department Boston University Lecture 08: Type Classes o o Review: What is a type class? Basic Type Classes: Eq, Ord, Enum, Integral,

More information

Programming with Math and Logic

Programming with Math and Logic .. Programming with Math and Logic an invitation to functional programming Ed Morehouse Wesleyan University The Plan why fp? terms types interfaces The What and Why of Functional Programming Computing

More information

User-Defined Algebraic Data Types

User-Defined Algebraic Data Types 72 Static Semantics User-Defined Types User-Defined Algebraic Data Types An algebraic data type declaration has the general form: data cx T α 1... α k = K 1 τ 11... τ 1k1... K n τ n1... τ nkn introduces

More information

Haskell Types, Classes, and Functions, Currying, and Polymorphism

Haskell Types, Classes, and Functions, Currying, and Polymorphism 1 CSCE 314: Programming Languages Dr. Flemming Andersen Haskell Types, Classes, and Functions, Currying, and Polymorphism 2 Types A type is a collection of related values. For example, Bool contains the

More information

GADTs. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 7. [Faculty of Science Information and Computing Sciences]

GADTs. Wouter Swierstra and Alejandro Serrano. Advanced functional programming - Lecture 7. [Faculty of Science Information and Computing Sciences] GADTs Advanced functional programming - Lecture 7 Wouter Swierstra and Alejandro Serrano 1 Today s lecture Generalized algebraic data types (GADTs) 2 A datatype data Tree a = Leaf Node (Tree a) a (Tree

More information

CSC324 Principles of Programming Languages

CSC324 Principles of Programming Languages CSC324 Principles of Programming Languages http://mcs.utm.utoronto.ca/~324 November 14, 2018 Today Final chapter of the course! Types and type systems Haskell s type system Types Terminology Type: set

More information

GADTs. Wouter Swierstra. Advanced functional programming - Lecture 7. Faculty of Science Information and Computing Sciences

GADTs. Wouter Swierstra. Advanced functional programming - Lecture 7. Faculty of Science Information and Computing Sciences GADTs Advanced functional programming - Lecture 7 Wouter Swierstra 1 Today s lecture Generalized algebraic data types (GADTs) 2 A datatype data Tree a = Leaf Node (Tree a) a (Tree a) This definition introduces:

More information

Haskell 98 in short! CPSC 449 Principles of Programming Languages

Haskell 98 in short! CPSC 449 Principles of Programming Languages Haskell 98 in short! n Syntax and type inferencing similar to ML! n Strongly typed! n Allows for pattern matching in definitions! n Uses lazy evaluation" F definition of infinite lists possible! n Has

More information

GADTs. Alejandro Serrano. AFP Summer School. [Faculty of Science Information and Computing Sciences]

GADTs. Alejandro Serrano. AFP Summer School. [Faculty of Science Information and Computing Sciences] GADTs AFP Summer School Alejandro Serrano 1 Today s lecture Generalized algebraic data types (GADTs) 2 A datatype data Tree a = Leaf Node (Tree a) a (Tree a) This definition introduces: 3 A datatype data

More information

n n Try tutorial on front page to get started! n spring13/ n Stack Overflow!

n   n Try tutorial on front page to get started! n   spring13/ n Stack Overflow! Announcements n Rainbow grades: HW1-6, Quiz1-5, Exam1 n Still grading: HW7, Quiz6, Exam2 Intro to Haskell n HW8 due today n HW9, Haskell, out tonight, due Nov. 16 th n Individual assignment n Start early!

More information

These notes are intended exclusively for the personal usage of the students of CS352 at Cal Poly Pomona. Any other usage is prohibited without

These notes are intended exclusively for the personal usage of the students of CS352 at Cal Poly Pomona. Any other usage is prohibited without These notes are intended exclusively for the personal usage of the students of CS352 at Cal Poly Pomona. Any other usage is prohibited without previous written authorization. 1 2 The simplest way to create

More information

Topic 6: Partial Application, Function Composition and Type Classes

Topic 6: Partial Application, Function Composition and Type Classes Topic 6: Partial Application, Function Composition and Type Classes Recommended Exercises and Readings From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 11.11, 11.12 12.30, 12.31,

More information

Topic 6: Partial Application, Function Composition and Type Classes

Topic 6: Partial Application, Function Composition and Type Classes Topic 6: Partial Application, Function Composition and Type Classes 1 Recommended Exercises and Readings From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 11.11, 11.12 12.30, 12.31,

More information

A general introduction to Functional Programming using Haskell

A general introduction to Functional Programming using Haskell A general introduction to Functional Programming using Haskell Matteo Rossi Dipartimento di Elettronica e Informazione Politecnico di Milano rossi@elet.polimi.it 1 Functional programming in a nutshell

More information

Logic - CM0845 Introduction to Haskell

Logic - CM0845 Introduction to Haskell Logic - CM0845 Introduction to Haskell Diego Alejandro Montoya-Zapata EAFIT University Semester 2016-1 Diego Alejandro Montoya-Zapata (EAFIT University) Logic - CM0845 Introduction to Haskell Semester

More information

CS558 Programming Languages

CS558 Programming Languages CS558 Programming Languages Winter 2018 Lecture 7b Andrew Tolmach Portland State University 1994-2018 Dynamic Type Checking Static type checking offers the great advantage of catching errors early And

More information

Programming Languages Fall 2013

Programming Languages Fall 2013 Programming Languages Fall 2013 Lecture 2: types Prof. Liang Huang huang@qc.cs.cuny.edu Recap of Lecture 1 functional programming vs. imperative programming basic Haskell syntax function definition lazy

More information

CSE-321 Programming Languages 2010 Final

CSE-321 Programming Languages 2010 Final Name: Hemos ID: CSE-321 Programming Languages 2010 Final Prob 1 Prob 2 Prob 3 Prob 4 Prob 5 Prob 6 Total Score Max 18 28 16 12 36 40 150 There are six problems on 16 pages, including two work sheets, in

More information

Lecture 2: List algorithms using recursion and list comprehensions

Lecture 2: List algorithms using recursion and list comprehensions Lecture 2: List algorithms using recursion and list comprehensions Søren Haagerup Department of Mathematics and Computer Science University of Southern Denmark, Odense September 12, 2017 Expressions, patterns

More information

Type families and data kinds

Type families and data kinds Type families and data kinds AFP Summer School Wouter Swierstra 1 Today How do GADTs work? Kinds beyond * Programming with types 2 Calling functions on vectors Given two vectors xs : Vec a n and ys : Vec

More information

CS558 Programming Languages

CS558 Programming Languages CS558 Programming Languages Fall 2017 Lecture 7b Andrew Tolmach Portland State University 1994-2017 Type Inference Some statically typed languages, like ML (and to a lesser extent Scala), offer alternative

More information

Introduction to Functional Programming in Haskell 1 / 56

Introduction to Functional Programming in Haskell 1 / 56 Introduction to Functional Programming in Haskell 1 / 56 Outline Why learn functional programming? The essence of functional programming What is a function? Equational reasoning First-order vs. higher-order

More information

Overview. Declarative Languages D7012E. Overloading. Overloading Polymorphism Subtyping

Overview. Declarative Languages D7012E. Overloading. Overloading Polymorphism Subtyping Overview Declarative Languages D7012E Lecture 4: The Haskell type system Fredrik Bengtsson / Johan Nordlander Overloading & polymorphism Type classes instances of type classes derived type classes Type

More information

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages

Harvard School of Engineering and Applied Sciences CS 152: Programming Languages Harvard School of Engineering and Applied Sciences CS 152: Programming Languages Lecture 18 Thursday, March 29, 2018 In abstract algebra, algebraic structures are defined by a set of elements and operations

More information

Chapter 2 Comparing Approaches to Generic Programming in Haskell

Chapter 2 Comparing Approaches to Generic Programming in Haskell Chapter 2 Comparing Approaches to Generic Programming in Haskell Ralf Hinze 1, Johan Jeuring 2, and Andres Löh 1 1 Institut für Informatik III, Universität Bonn Römerstraße 164, 53117 Bonn, Germany {ralf,loeh}@informatik.uni-bonn.de

More information

Exercise 1 ( = 24 points)

Exercise 1 ( = 24 points) 1 Exercise 1 (4 + 5 + 4 + 6 + 5 = 24 points) The following data structure represents polymorphic binary trees that contain values only in special Value nodes that have a single successor: data Tree a =

More information

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions

PROGRAMMING IN HASKELL. Chapter 5 - List Comprehensions PROGRAMMING IN HASKELL Chapter 5 - List Comprehensions 0 Set Comprehensions In mathematics, the comprehension notation can be used to construct new sets from old sets. {x 2 x {1...5}} The set {1,4,9,16,25}

More information

Haskell Overview II (2A) Young Won Lim 8/9/16

Haskell Overview II (2A) Young Won Lim 8/9/16 (2A) Copyright (c) 2016 Young W. Lim. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published

More information

Topic 9: Type Checking

Topic 9: Type Checking Recommended Exercises and Readings Topic 9: Type Checking From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 13.17, 13.18, 13.19, 13.20, 13.21, 13.22 Readings: Chapter 13.5, 13.6 and

More information

Topic 9: Type Checking

Topic 9: Type Checking Topic 9: Type Checking 1 Recommended Exercises and Readings From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 13.17, 13.18, 13.19, 13.20, 13.21, 13.22 Readings: Chapter 13.5, 13.6

More information

Lecture 4: Higher Order Functions

Lecture 4: Higher Order Functions Lecture 4: Higher Order Functions Søren Haagerup Department of Mathematics and Computer Science University of Southern Denmark, Odense September 26, 2017 HIGHER ORDER FUNCTIONS The order of a function

More information

Programming in Omega Part 1. Tim Sheard Portland State University

Programming in Omega Part 1. Tim Sheard Portland State University Programming in Omega Part 1 Tim Sheard Portland State University Tim Sheard Computer Science Department Portland State University Portland, Oregon PSU PL Research at Portland State University The Programming

More information

Haskell Overloading (1) LiU-FP2016: Lecture 8 Type Classes. Haskell Overloading (3) Haskell Overloading (2)

Haskell Overloading (1) LiU-FP2016: Lecture 8 Type Classes. Haskell Overloading (3) Haskell Overloading (2) Haskell Overloading (1) LiU-FP2016: Lecture 8 Type Classes Henrik Nilsson University of Nottingham, UK What is the type of (==)? E.g. the following both work: 1 == 2 a == b I.e., (==) can be used to compare

More information

Exercise 1 ( = 18 points)

Exercise 1 ( = 18 points) 1 Exercise 1 (4 + 5 + 4 + 5 = 18 points) The following data structure represents polymorphic binary trees that contain values only in special Value nodes that have a single successor: data Tree a = Leaf

More information

CSCE 314 Programming Languages

CSCE 314 Programming Languages CSCE 314 Programming Languages Haskell: Declaring Types and Classes Dr. Hyunyoung Lee 1 Outline Declaring Data Types Class and Instance Declarations 2 Defining New Types Three constructs for defining types:

More information

Exercise 1 ( = 22 points)

Exercise 1 ( = 22 points) 1 Exercise 1 (4 + 3 + 4 + 5 + 6 = 22 points) The following data structure represents polymorphic lists that can contain values of two types in arbitrary order: data DuoList a b = C a (DuoList a b) D b

More information

Unifying Nominal and Structural Ad-Hoc Polymorphism

Unifying Nominal and Structural Ad-Hoc Polymorphism Unifying Nominal and Structural Ad-Hoc Polymorphism Stephanie Weirich University of Pennsylvania Joint work with Geoff Washburn Ad-hoc polymorphism Define operations that can be used for many types of

More information

Part III. Chapter 15: Subtyping

Part III. Chapter 15: Subtyping Part III Chapter 15: Subtyping Subsumption Subtype relation Properties of subtyping and typing Subtyping and other features Intersection and union types Subtyping Motivation With the usual typing rule

More information

Solution sheet 1. Introduction. Exercise 1 - Types of values. Exercise 2 - Constructors

Solution sheet 1. Introduction. Exercise 1 - Types of values. Exercise 2 - Constructors Solution sheet 1 Introduction Please note that there can be other solutions than those listed in this document. This is a literate Haskell file which is available as PDF, as well as literate Haskell source

More information

Polymorphism and System-F (OV)

Polymorphism and System-F (OV) Polymorphism and System-F (OV) Theorie der Programmierung SoSe 2014 FAU the occurrence of something in several different forms Polymorphism? Polymorphic systems Type systems that allow a single piece of

More information

Generalized Iteration and Coiteration for Higher-Order Nested Datatypes

Generalized Iteration and Coiteration for Higher-Order Nested Datatypes Generalized Iteration and Coiteration for Higher-Order Nested Datatypes Mendler rules! Andreas Abel (joint work with Ralph Matthes and Tarmo Uustalu) Slide 1 FoSSaCS 2003 Warsaw, Poland April 8, 2003 Work

More information

Chapter 15. Functional Programming. Topics. Currying. Currying: example. Currying: example. Reduction

Chapter 15. Functional Programming. Topics. Currying. Currying: example. Currying: example. Reduction Topics Chapter 15 Functional Programming Reduction and Currying Recursive definitions Local definitions Type Systems Strict typing Polymorphism Classes Booleans Characters Enumerations Tuples Strings 2

More information

Lecture #13: Type Inference and Unification. Typing In the Language ML. Type Inference. Doing Type Inference

Lecture #13: Type Inference and Unification. Typing In the Language ML. Type Inference. Doing Type Inference Lecture #13: Type Inference and Unification Typing In the Language ML Examples from the language ML: fun map f [] = [] map f (a :: y) = (f a) :: (map f y) fun reduce f init [] = init reduce f init (a ::

More information

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml

COSE212: Programming Languages. Lecture 3 Functional Programming in OCaml COSE212: Programming Languages Lecture 3 Functional Programming in OCaml Hakjoo Oh 2017 Fall Hakjoo Oh COSE212 2017 Fall, Lecture 3 September 18, 2017 1 / 44 Why learn ML? Learning ML is a good way of

More information

Introduction to Typed Racket. The plan: Racket Crash Course Typed Racket and PL Racket Differences with the text Some PL Racket Examples

Introduction to Typed Racket. The plan: Racket Crash Course Typed Racket and PL Racket Differences with the text Some PL Racket Examples Introduction to Typed Racket The plan: Racket Crash Course Typed Racket and PL Racket Differences with the text Some PL Racket Examples Getting started Find a machine with DrRacket installed (e.g. the

More information

Generic Haskell: practice and theory

Generic Haskell: practice and theory Generic Haskell: practice and theory Ralf Hinze 1 and Johan Jeuring 2,3 1 Institut für Informatik III, Universität Bonn Römerstraße 164, 53117 Bonn, Germany ralf@informatik.uni-bonn.de http://www.informatik.uni-bonn.de/~ralf/

More information

Lecture #23: Conversion and Type Inference

Lecture #23: Conversion and Type Inference Lecture #23: Conversion and Type Inference Administrivia. Due date for Project #2 moved to midnight tonight. Midterm mean 20, median 21 (my expectation: 17.5). Last modified: Fri Oct 20 10:46:40 2006 CS164:

More information

Conversion vs. Subtyping. Lecture #23: Conversion and Type Inference. Integer Conversions. Conversions: Implicit vs. Explicit. Object x = "Hello";

Conversion vs. Subtyping. Lecture #23: Conversion and Type Inference. Integer Conversions. Conversions: Implicit vs. Explicit. Object x = Hello; Lecture #23: Conversion and Type Inference Administrivia. Due date for Project #2 moved to midnight tonight. Midterm mean 20, median 21 (my expectation: 17.5). In Java, this is legal: Object x = "Hello";

More information

Giving Haskell a Promotion

Giving Haskell a Promotion Giving Haskell a Promotion José Pedro Magalhães Joint work with Brent A. Yorgey Stephanie Weirich Julien Cretin Simon Peyton Jones Dimitrios Vytiniotis http://www.dreixel.net FP dag 2012, Universiteit

More information

Functional Programming Mid-term exam Tuesday 3/10/2017

Functional Programming Mid-term exam Tuesday 3/10/2017 Functional Programming Mid-term exam Tuesday 3/10/2017 Name: Student number: Before you begin: Do not forget to write down your name and student number above. If necessary, explain your answers in English.

More information

Type Classes in Haskell Tom Schrijvers. Leuven Haskell User Group

Type Classes in Haskell Tom Schrijvers. Leuven Haskell User Group Type Classes in Haskell Tom Schrijvers Leuven Haskell User Group Haskell Research Team Partners Monads Type Classes GHC Folds Pattern Matching Equational Reasoning DSLs Advanced Types Adhoc Overloading

More information

PROGRAMMING IN HASKELL. Chapter 2 - First Steps

PROGRAMMING IN HASKELL. Chapter 2 - First Steps PROGRAMMING IN HASKELL Chapter 2 - First Steps 0 The Hugs System Hugs is an implementation of Haskell 98, and is the most widely used Haskell system; The interactive nature of Hugs makes it well suited

More information

Programming in Haskell Aug-Nov 2015

Programming in Haskell Aug-Nov 2015 Programming in Haskell Aug-Nov 2015 LECTURE 14 OCTOBER 1, 2015 S P SURESH CHENNAI MATHEMATICAL INSTITUTE Enumerated data types The data keyword is used to define new types data Bool = False True data Day

More information

Type Processing by Constraint Reasoning

Type Processing by Constraint Reasoning , Martin Sulzmann, Jeremy Wazny 8th November 2006 Chameleon Chameleon is Haskell-style language treats type problems using constraints gives expressive error messages has a programmable type system Developers:

More information

Programming Languages Lecture 15: Recursive Types & Subtyping

Programming Languages Lecture 15: Recursive Types & Subtyping CSE 230: Winter 2008 Principles of Programming Languages Lecture 15: Recursive Types & Subtyping Ranjit Jhala UC San Diego News? Formalize first-order type systems Simple types (integers and booleans)

More information

Exercise 1 (2+2+2 points)

Exercise 1 (2+2+2 points) 1 Exercise 1 (2+2+2 points) The following data structure represents binary trees only containing values in the inner nodes: data Tree a = Leaf Node (Tree a) a (Tree a) 1 Consider the tree t of integers

More information

Part III Chapter 15: Subtyping

Part III Chapter 15: Subtyping Part III Chapter 15: Subtyping Subsumption Subtype relation Properties of subtyping and typing Subtyping and other features Intersection and union types Subtyping Motivation With the usual typing rule

More information

Informatics 1 Functional Programming Lecture 9. Algebraic Data Types. Don Sannella University of Edinburgh

Informatics 1 Functional Programming Lecture 9. Algebraic Data Types. Don Sannella University of Edinburgh Informatics 1 Functional Programming Lecture 9 Algebraic Data Types Don Sannella University of Edinburgh Part I Algebraic types Everything is an algebraic type data Bool = False True data Season = Winter

More information

Topic 5: Higher Order Functions

Topic 5: Higher Order Functions Topic 5: Higher Order Functions 1 Recommended Exercises and Readings From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.10,

More information

Topic 5: Higher Order Functions

Topic 5: Higher Order Functions Topic 5: Higher Order Functions 1 Recommended Exercises and Readings From Haskell: The craft of functional programming (3 rd Ed.) Exercises: 10.1, 10.2, 10.3, 10.4, 10.5, 10.6, 10.7, 10.8, 10.9, 10.10,

More information

Lecture 19: Functions, Types and Data Structures in Haskell

Lecture 19: Functions, Types and Data Structures in Haskell The University of North Carolina at Chapel Hill Spring 2002 Lecture 19: Functions, Types and Data Structures in Haskell Feb 25 1 Functions Functions are the most important kind of value in functional programming

More information

INTRODUCTION TO HASKELL

INTRODUCTION TO HASKELL INTRODUCTION TO HASKELL PRINCIPLES OF PROGRAMMING LANGUAGES Norbert Zeh Winter 2018 Dalhousie University 1/81 HASKELL: A PURELY FUNCTIONAL PROGRAMMING LANGUAGE Functions are first-class values: Can be

More information

Generic Programming in 3D

Generic Programming in 3D Generic Programming in 3D Ralf Hinze a, Andres Löh b a Institut für Informatik III, Universität Bonn Römerstraße 164, 53117 Bonn, Germany b Utrecht University, Department of Information and Computing Sciences

More information

CS 320 Homework One Due 2/5 11:59pm

CS 320 Homework One Due 2/5 11:59pm Name: BU ID (no dashes): CS 320 Homework One Due 2/5 11:59pm Write your answers to the problems in the space indicated. Scan your solution and submit to Gradescope as a PDF file. You will receive an email

More information

CS 320: Concepts of Programming Languages

CS 320: Concepts of Programming Languages CS 320: Concepts of Programming Languages Wayne Snyder Computer Science Department Boston University Lecture 04: Basic Haskell Continued o Polymorphic Types o Type Inference with Polymorphism o Standard

More information

EDAF40. 2nd June :00-19:00. WRITE ONLY ON ONE SIDE OF THE PAPER - the exams will be scanned in and only the front/ odd pages will be read.

EDAF40. 2nd June :00-19:00. WRITE ONLY ON ONE SIDE OF THE PAPER - the exams will be scanned in and only the front/ odd pages will be read. EDAF40 2nd June 2017 14:00-19:00 WRITE ONLY ON ONE SIDE OF THE PAPER - the exams will be scanned in and only the front/ odd pages will be read. DO NOT WRITE WITH OTHER COLOUR THAN BLACK - coloured text

More information

IA014: Advanced Functional Programming

IA014: Advanced Functional Programming IA014: Advanced Functional Programming 8. GADT Generalized Algebraic Data Types (and type extensions) Jan Obdržálek obdrzalek@fi.muni.cz Faculty of Informatics, Masaryk University, Brno Motivation IA014

More information

Haskell Overview II (2A) Young Won Lim 8/23/16

Haskell Overview II (2A) Young Won Lim 8/23/16 (2A) Copyright (c) 2016 Young W. Lim. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published

More information

Introduction to Programming, Aug-Dec 2006

Introduction to Programming, Aug-Dec 2006 Introduction to Programming, Aug-Dec 2006 Lecture 3, Friday 11 Aug 2006 Lists... We can implicitly decompose a list into its head and tail by providing a pattern with two variables to denote the two components

More information

CS 4110 Programming Languages & Logics. Lecture 27 Recursive Types

CS 4110 Programming Languages & Logics. Lecture 27 Recursive Types CS 4110 Programming Languages & Logics Lecture 27 Recursive Types 4 November 2016 Announcements 2 My office hours are at the normal time today but canceled on Monday Guest lecture by Seung Hee Han on Monday

More information

Inductive datatypes in HOL. lessons learned in Formal-Logic Engineering

Inductive datatypes in HOL. lessons learned in Formal-Logic Engineering Inductive datatypes in HOL lessons learned in Formal-Logic Engineering Stefan Berghofer and Markus Wenzel Institut für Informatik TU München = Isabelle λ β HOL α 1 Introduction Applications of inductive

More information

Questions? Static Semantics. Static Semantics. Static Semantics. Next week on Wednesday (5 th of October) no

Questions? Static Semantics. Static Semantics. Static Semantics. Next week on Wednesday (5 th of October) no Questions? First exercise is online: http://www.win.tue.nl/~mvdbrand/courses/glt/1112/ Deadline 17 th of October Next week on Wednesday (5 th of October) no lectures!!! Primitive types Primitive value

More information

Advanced features of Functional Programming (Haskell)

Advanced features of Functional Programming (Haskell) Advanced features of Functional Programming (Haskell) Polymorphism and overloading January 10, 2017 Monomorphic and polymorphic types A (data) type specifies a set of values. Examples: Bool: the type of

More information

Types-2. Polymorphism

Types-2. Polymorphism Types-2 Polymorphism Type reconstruction (type inference) for a simple PL Typing functions Coercion, conversion, reconstruction Rich area of programming language research as people try to provide safety

More information

CS 457/557: Functional Languages

CS 457/557: Functional Languages CS 457/557: Functional Languages From Trees to Type Classes Mark P Jones Portland State University 1 Trees:! " There are many kinds of tree data structure.! " For example: data BinTree a = Leaf a BinTree

More information

Haskell Overview II (2A) Young Won Lim 9/26/16

Haskell Overview II (2A) Young Won Lim 9/26/16 (2A) Copyright (c) 2016 Young W. Lim. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published

More information

Reasoning About Imperative Programs. COS 441 Slides 10

Reasoning About Imperative Programs. COS 441 Slides 10 Reasoning About Imperative Programs COS 441 Slides 10 The last few weeks Agenda reasoning about functional programming It s very simple and very uniform: substitution of equal expressions for equal expressions

More information

CS 320: Concepts of Programming Languages

CS 320: Concepts of Programming Languages CS 320: Concepts of Programming Languages Wayne Snyder Computer Science Department Boston University Lecture 03: Bare-Bones Haskell Continued: o Function Application = Rewriting by Pattern Matching o Haskell

More information

Pattern Matching and Abstract Data Types

Pattern Matching and Abstract Data Types Pattern Matching and Abstract Data Types Tom Murphy VII 3 Dec 2002 0-0 Outline Problem Setup Views ( Views: A Way For Pattern Matching To Cohabit With Data Abstraction, Wadler, 1986) Active Patterns (

More information

CS 209 Functional Programming

CS 209 Functional Programming CS 209 Functional Programming Lecture 03 - Intro to Monads Dr. Greg Lavender Department of Computer Science Stanford University "The most important thing in a programming language is the name. A language

More information

Harvard School of Engineering and Applied Sciences Computer Science 152

Harvard School of Engineering and Applied Sciences Computer Science 152 Harvard School of Engineering and Applied Sciences Computer Science 152 Lecture 17 Tuesday, March 30, 2010 1 Polymorph means many forms. Polymorphism is the ability of code to be used on values of different

More information

CSE399: Advanced Programming. Handout 2

CSE399: Advanced Programming. Handout 2 CSE399: Advanced Programming Handout 2 Higher-Order Programming Functions as Data In Haskell (and other functional languages), functions can be treated as ordinary data they can be passed as arguments

More information

Programming Languages Lecture 14: Sum, Product, Recursive Types

Programming Languages Lecture 14: Sum, Product, Recursive Types CSE 230: Winter 200 Principles of Programming Languages Lecture 4: Sum, Product, Recursive Types The end is nigh HW 3 No HW 4 (= Final) Project (Meeting + Talk) Ranjit Jhala UC San Diego Recap Goal: Relate

More information

Inductive Data Types

Inductive Data Types Inductive Data Types Lars-Henrik Eriksson Functional Programming 1 Original slides by Tjark Weber Lars-Henrik Eriksson (UU) Inductive Data Types 1 / 42 Inductive Data Types Today Today New names for old

More information

CSc 372 Comparative Programming Languages

CSc 372 Comparative Programming Languages CSc 372 Comparative Programming Languages 8 : Haskell Function Examples Christian Collberg collberg+372@gmail.com Department of Computer Science University of Arizona Copyright c 2005 Christian Collberg

More information

Polymorphic lambda calculus Princ. of Progr. Languages (and Extended ) The University of Birmingham. c Uday Reddy

Polymorphic lambda calculus Princ. of Progr. Languages (and Extended ) The University of Birmingham. c Uday Reddy 06-02552 Princ. of Progr. Languages (and Extended ) The University of Birmingham Spring Semester 2016-17 School of Computer Science c Uday Reddy2016-17 Handout 6: Polymorphic Type Systems 1. Polymorphic

More information

Talen en Compilers. Jurriaan Hage , period 2. November 13, Department of Information and Computing Sciences Utrecht University

Talen en Compilers. Jurriaan Hage , period 2. November 13, Department of Information and Computing Sciences Utrecht University Talen en Compilers 2017-2018, period 2 Jurriaan Hage Department of Information and Computing Sciences Utrecht University November 13, 2017 1. Introduction 1-1 This lecture Introduction Course overview

More information

CSc 372. Comparative Programming Languages. 8 : Haskell Function Examples. Department of Computer Science University of Arizona

CSc 372. Comparative Programming Languages. 8 : Haskell Function Examples. Department of Computer Science University of Arizona 1/43 CSc 372 Comparative Programming Languages 8 : Haskell Function Examples Department of Computer Science University of Arizona collberg@gmail.com Copyright c 2013 Christian Collberg Functions over Lists

More information

Generating Generic Functions

Generating Generic Functions Generating Generic Functions Johan Jeuring Alexey Rodriguez Gideon Smeding Department of Information and Computing Sciences, Utrecht University Technical Report UU-CS-2006-039 www.cs.uu.nl ISSN: 0924-3275

More information

Haskell An Introduction

Haskell An Introduction Haskell An Introduction What is Haskell? General purpose Purely functional No function can have side-effects IO is done using special types Lazy Strongly typed Polymorphic types Concise and elegant A First

More information

CS 11 Haskell track: lecture 4. n This week: Monads!

CS 11 Haskell track: lecture 4. n This week: Monads! CS 11 Haskell track: lecture 4 This week: Monads! Monads Have already seen an example of a monad IO monad But similar concepts can be used for a lot of completely unrelated tasks Monads are useful "general

More information