Haskell Chapter 7. Topics  Defining data types  Exporting types  Type parameters  Derived instances  Type synonyms  Either  Type classes  Not.

Slides:



Advertisements
Similar presentations
Modelling & Datatypes John Hughes. Software Software = Programs + Data.
Advertisements

15-Jan-15 More Haskell Functions Maybe, Either, List, Set, Map.
CMSC 330: Organization of Programming Languages Tuples, Types, Conditionals and Recursion or “How many different OCaml topics can we cover in a single.
Core Java Lecture 4-5. What We Will Cover Today What Are Methods Scope and Life Time of Variables Command Line Arguments Use of static keyword in Java.
Haskell Chapter 5, Part I. Topics  Higher Order Functions  map, filter  Infinite lists Get out a piece of paper… we’ll be doing lots of tracing.
0 PROGRAMMING IN HASKELL Chapter 10 - Declaring Types and Classes.
String is a synonym for the type [Char].
Using Types Slides thanks to Mark Jones. 2 Expressions Have Types: The type of an expression tells you what kind of value you might expect to see if you.
Grab Bag of Interesting Stuff. Topics Higher kinded types Files and handles IOError Arrays.
Lecture 17 Abstract classes Interfaces The Comparable interface Event listeners All in chapter 10: please read it.
1 Chapter 4 Language Fundamentals. 2 Identifiers Program parts such as packages, classes, and class members have names, which are formally known as identifiers.
Advanced Programming Handout 9 Qualified Types (SOE Chapter 12)
Introduction to ML - Part 2 Kenny Zhu. What is next? ML has a rich set of structured values Tuples: (17, true, “stuff”) Records: {name = “george”, age.
Constants. 2 Objectives Describe ways to create constants –const –readonly –enum.
Copyright © 2006 The McGraw-Hill Companies, Inc. Programming Languages 2nd edition Tucker and Noonan Chapter 5 Types Types are the leaven of computer programming;
Chapter 12 Qualified Types. Motivation  What should the principal type of (+) be? Int -> Int -> Int-- too specific a -> a -> a-- too general  It seems.
3.1 Documentation & Java Language Elements Purpose of documentation Assist the programmer with developing the program Assist other programers who.
0 PROGRAMMING IN HASKELL Typeclasses and higher order functions Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and.
Patterns in OCaml functions. Formal vs. actual parameters Here's a function definition (in C): –int add (int x, int y) { return x + y; } –x and y are.
Arrays Part 9 dbg. Arrays An array is a fixed number of contiguous memory locations, all containing data of the same type, identified by one variable.
C# D1 CSC 298 Elements of C# code (part 2). C# D2 Writing a class (or a struct)  Similarly to Java or C++  Fields: to hold the class data  Methods:
5 BASIC CONCEPTS OF ANY PROGRAMMING LANGUAGE Let’s get started …
Lee CSCE 314 TAMU 1 CSCE 314 Programming Languages Haskell: Types and Classes Dr. Hyunyoung Lee.
1 Functional Programming Lecture 6 - Algebraic Data Types.
Overview of the Haskell 98 Programming Language
0 Functors in Haskell Adapted from material by Miran Lipovaca.
Compound Statements If you want to do more than one statement if an if- else case, you can form a block of statements, or compound statement, by enclosing.
Types(1). Lecture 52 Type(1)  A type is a collection of values and operations on those values. Integer type  values..., -2, -1, 0, 1, 2,...  operations.
© M. Winter COSC 4P41 – Functional Programming Modules in Haskell Using modules to structure a large program has a number of advantages: Parts of.
0 Odds and Ends in Haskell: Folding, I/O, and Functors Adapted from material by Miran Lipovaca.
Working With Objects Tonga Institute of Higher Education.
 In the java programming language, a keyword is one of 50 reserved words which have a predefined meaning in the language; because of this,
Programmeren 1 6 september 2010 HOORCOLLEGE 2: INTERACTIE EN CONDITIES PROGRAMMEREN 1 6 SEPTEMBER 2009 Software Systems - Programming - Week.
Inheritance and Class Hierarchies Chapter 3. Chapter 3: Inheritance and Class Hierarchies2 Chapter Objectives To understand inheritance and how it facilitates.
1 / 71 COP 3503 FALL 2012 SHAYAN JAVED LECTURE 4 Programming Fundamentals using Java 1.
0 PROGRAMMING IN HASKELL Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and a few other sources) Odds and Ends,
Eight languages Eight weeks How I designed and implemented a teaching OO language in 4 days.
BUILDING JAVA PROGRAMS CHAPTER 7 Arrays days until the AP Computer Science test.
1.1: Objects and Classes msklug.weebly.com. Agenda: Attendance Let’s get started What is Java? Work Time.
More Data Types CSCE 314 Spring CSCE 314 – Programming Studio Defining New Data Types Three ways to define types: 1.type – Define a synonym for.
Week 6 - Friday.  What did we talk about last time?  Loop examples.
Haskell Chapter 5, Part II. Topics  Review/More Higher Order Functions  Lambda functions  Folds.
Defining Classes Modules and ADTs CSCE 314 Spring 2016.
1 Objective Caml (Ocaml) Aaron Bloomfield CS 415 Fall 2005.
An introduction to functional programming using Haskell CENG242 –Recitation 1.
0 PROGRAMMING IN HASKELL Typeclasses and higher order functions Based on lecture notes by Graham Hutton The book “Learn You a Haskell for Great Good” (and.
Polymorphic Functions
Haskell Chapter 7.
String is a synonym for the type [Char].
4. Java language basics: Function
Types CSCE 314 Spring 2016.
Haskell Chapter 2.
PROGRAMMING IN HASKELL
Object Oriented Programming (OOP) LAB # 8
PROGRAMMING IN HASKELL
Computer Science 312 Haskell Lists 1.
Week 6 Object-Oriented Programming (2): Polymorphism
PROGRAMMING IN HASKELL
Type & Typeclass Syntax in function
Types and Classes in Haskell
PROGRAMMING IN HASKELL
Haskell Types, Classes, and Functions, Currying, and Polymorphism
Records and Type Classes
Grab Bag of Interesting Stuff
Java Programming Language
Defining New Data Types
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
Records and Type Classes
Presentation transcript:

Haskell Chapter 7

Topics  Defining data types  Exporting types  Type parameters  Derived instances  Type synonyms  Either  Type classes  Not covered  record syntax  recursive data structures  subclassing  parameterized types as instances of type classes  Yes-No type class (emulate JavaScript-like behavior)  Functor type class

Define a new data type data Bool = False | True  data keyword indicates a new data type (Bool is not new, just an example)  False and True are value constructors  | is “or” – Bool can be False or True  Type name and value constructors must start with capital letter  Value constructors are actually functions that return a value of a data type

Shape example -- Circle parms coordinates and radius -- Rectangle parms upper left and lower right coordinates data Shape = Circle Float Float Float | Rectangle Float Float Float Float  *Main> :t Circle  Circle :: Float -> Float -> Float -> Shape  *Main> :t Rectangle  Rectangle :: Float -> Float -> Float -> Float -> Shape

Shape continued area :: Shape -> Float area (Circle _ _ r) = pi * r ^2 area (Rectangle x1 y1 x2 y2) = (abs $ x2 - x1) * (abs y2 - y1)  Notice the pattern match against constructor  *Main> let c = Circle  *Main> area c   But we don’t know how to show a circle (yet)  *Main> c  :15:1:  No instance for (Show Shape)  arising from a use of `print'  Possible fix: add an instance declaration for (Show Shape)  In a stmt of an interactive GHCi command: print it remember $ is function application

Updating shape to be displayed data Shape = Circle Float Float Float | Rectangle Float Float Float Float deriving (Show)  *Main> let c = Circle  *Main> c  Circle

Improving Shape with a Point data type data Point = Point Float Float deriving (Show) data Shape = Circle Point Float | Rectangle Point Point deriving (Show) area :: Shape -> Float area (Circle _ r) = pi * r ^2 area (Rectangle (Point x1 y1) (Point x2 y2)) = (abs $ x2 - x1) * (abs y2 - y1)  *Main> area (Rectangle (Point 0 0) (Point )) 

Another method for Shapes nudge :: Shape -> Float -> Float -> Shape nudge (Circle (Point x y) r) dx dy = Circle (Point (x+dx) (y+dy)) r nudge (Rectangle (Point x1 y1) (Point x2 y2)) dx dy = Rectangle (Point (x1+dx) (y1+dy)) (Point (x2+dx) (y2+dy))  *Main> nudge (Circle (Point 34 34) 10) 5 10  Circle (Point ) 10.0

Exporting shape module Shapes ( Point(..), Shape(..), area, nudge ) where  Shape(..) exports all value constructors (in this case Circle and Rectangle).  Makes it easy to add more shapes later (OCP)  If just export Shape, not Shape(..), can’t pattern match (Programming Languages: support for encapsulation)

Type Parameters  A value constructors takes some parameters, produces a new value (e.g., Circle takes 3 values, returns a circle value)  A type constructor takes a type as a parameter, returns a new type  Maybe type constructor defined as: data Maybe a = Nothing | Just a  Can’t have just Maybe… needs to be Maybe something  Why is this useful? Strong typing. In Java, a function might return a Point or null. This is not possible in Haskell. So if a function may or may not produce a value, then the return type is Maybe something (e.g., Maybe Point)

Usage  Due to type inference, often don’t pass parameters to type constructors explicitly  If a value is Just ‘a’, Haskell infers type as Maybe Char  Concrete type either doesn’t take any type parameters, e.g., Int, Bool OR has filled type parameters (Maybe Char)  List type takes a parameter, returns concrete type  [Int] is an example

Play with it  *Main> Just "Haha"  Just "Haha"  *Main> Just 84  Just 84  *Main> :t Just "Haha"  Just "Haha" :: Maybe [Char]  *Main> :t Just 84  Just 84 :: Num a => Maybe a  *Main> :t Nothing  Nothing :: Maybe a  *Main> Just 10 :: Maybe Double  Just 10.0

Type class \= Java class  In Java, we use a class as a blueprint to create objects  In Haskell, you use type classes to make a data type, then think about how it can act  We do this with deriving  If types of all fields are part of a type class, then our new type can be part of a type class data Person = Person { name :: String, age :: Int } deriving (Eq, Show)

Example  *Shapes> let frodo = Person {name = "Frodo Baggins", age = 43}  *Shapes> let bilbo = Person {name = "Bilbo Baggins", age = 100}  *Shapes> bilbo  Person {name = "Bilbo Baggins", age = 100}  *Shapes> bilbo == frodo  False  *Shapes> let imposter = Person {name = "Frodo Baggins", age = 43}  *Shapes> frodo == imposter  True

Enum example data Day = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday deriving (Eq, Show, Ord, Read, Bounded, Enum) *Chap7> Wednesday Wednesday *Chap7> show Wednesday "Wednesday" *Chap7> read "Saturday" :: Day Saturday *Chap7> Saturday == Sunday False *Chap7> Monday `compare` Wednesday LT *Chap7> Saturday > Friday True *Chap7> minBound :: Day Monday *Chap7> maxBound :: Day Sunday *Chap7> let weekend = [Friday.. Sunday] *Chap7> weekend [Friday,Saturday,Sunday]

Type Synonyms  [Char] and String are type synonyms type PhoneNumber = String type Name = String type PhoneBook = [(Name, PhoneNumber)] inPhoneBook :: Name -> PhoneNumber -> PhoneBook -> Bool inPhoneBook name pnumber pbook = (name, pnumber) `elem` pbook Not covered: parameterized type synonyms

Could be Either  Use to encapsulate a value of one type or another  Is defined as:  data Either a b = Left a | Right b deriving (Eq, Ord, Read, Show)  *Chap7> Right 20  Right 20  *Chap7> Left "Whoa"  Left "Whoa"  *Chap7> :t Right 'a'  Right 'a' :: Either a Char  *Chap7> :t Left True  Left True :: Either Bool b

Either with try  The try functions  try :: Exception e => IO a -> IO (Either e a)SourceExceptionIO EitherSource  Similar to catch, but returns an Either result which is (Right a) if no exception of type e was raised, or (Left ex) if an exception of type e was raised and its value is ex. If any other type of exception is raised than it will be propogated up to the next enclosing exception handler.catchEitherRightLeft  try a = catch (Right `liftM` a) (return. Left)

Usage  Maybe can be used if function might return a result or fail  Either can be used if there are multiple possible results  You’ll explore this more in the homework

Type Classes 102  Type classes are sort of like interfaces: they define behavior  Types that can behave that way are made instances (just means they can use the functions associated with that type class) class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) note the mutual recursion… only need to implement one!

Using a type class data TrafficLight = Red | Yellow | Green instance Eq TrafficLight where Red == Red = True Green == Green = True Yellow == Yellow = True _ == _ = False instance Show TrafficLight where show Red = "Red Light" show Green = "Green Light" show Yellow = "Yellow Light"

Using the Traffic Light  *Chap7> Red  Red Light  *Chap7> Red  Red Light  *Chap7> Red == Red  True  *Chap7> Red == Green  False  *Chap7> Red `elem` [Red, Green, Yellow]  True