Background Type Classes (1B) Young Won Lim 6/28/18

Similar documents
Background Type Classes (1B) Young Won Lim 6/14/18

Polymorphism Overview (1A) Young Won Lim 2/20/18

Applicatives Comparisons (2C) Young Won Lim 3/6/18

Side Effects (3A) Young Won Lim 1/13/18

Monad Background (3A) Young Won Lim 11/18/17

Monad Background (3A) Young Won Lim 11/8/17

Side Effects (3B) Young Won Lim 11/27/17

Side Effects (3B) Young Won Lim 11/20/17

Side Effects (3B) Young Won Lim 11/23/17

Monad Background (3A) Young Won Lim 10/5/17

Maybe Monad (3B) Young Won Lim 12/21/17

Maybe Monad (3B) Young Won Lim 1/3/18

State Monad (3D) Young Won Lim 8/31/17

Programming with Math and Logic

Background Constructors (1A) Young Won Lim 7/9/18

Haskell Overview III (3A) Young Won Lim 10/4/16

Monad (1A) Young Won Lim 6/26/17

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

Monad (1A) Young Won Lim 6/9/17

Monad Overview (3B) Young Won Lim 1/16/18

Monad Background (3A) Young Won Lim 11/20/17

Background Operators (1E) Young Won Lim 7/7/18

Haskell Making Our Own Types and Typeclasses

CSC324 Principles of Programming Languages

Monad (3A) Young Won Lim 8/9/17

State Monad (3D) Young Won Lim 9/25/17

Programming in Haskell Aug Nov 2015

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

More on functional programming

Haskell: From Basic to Advanced. Part 2 Type Classes, Laziness, IO, Modules

GHCi: Getting started (1A) Young Won Lim 6/3/17

JVM ByteCode Interpreter

IO Monad (3D) Young Won Lim 1/18/18

CS 320: Concepts of Programming Languages

Monad (1A) Young Won Lim 6/21/17

Haskell Monads CSC 131. Kim Bruce

CS 11 Haskell track: lecture 1

An introduction to functional programming. July 23, 2010

GHCi: Getting started (1A) Young Won Lim 5/31/17

CSCE 314 Programming Languages Functors, Applicatives, and Monads

Advanced Topics in Programming Languages Lecture 2 - Introduction to Haskell

INDEX. Symbols & Numbers. Learn You a Haskell for Great Good! 2011 by Miran Lipovača

Haskell An Introduction

Libraries (1A) Young Won Lim 6/5/17

Monads. Functional Programming (CS4011) Monads

Background Constructors (1A) Young Won Lim 7/5/18

Background Functions (1C) Young Won Lim 5/26/18

Introduction to Haskell

IO Monad (3C) Young Won Lim 1/6/18

Advances in Programming Languages

Background Constructors (1A) Young Won Lim 6/30/18

Background Constructors (1A) Young Won Lim 1/22/18

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

Informatics 1 Functional Programming Lectures 15 and 16. IO and Monads. Don Sannella University of Edinburgh

Monad P1 : Several Monad Types (4A) Young Won Lim 2/13/19

Programming Paradigms

CS 440: Programming Languages and Translators, Spring 2019 Mon 2/4

Set Haskell Exercises

Logic Haskell Exercises

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

Functor (1A) Young Won Lim 8/2/17

Monads and all that III Applicative Functors. John Hughes Chalmers University/Quviq AB

Monads in Haskell. Nathanael Schilling. December 12, 2014

Course year Typeclasses and their instances

CSCE 314 Programming Languages

Functor (1A) Young Won Lim 10/5/17

FUNCTIONAL PROGRAMMING 1 HASKELL BASICS

Applicative, traversable, foldable

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

User-Defined Algebraic Data Types

Monoid (4A) Young Won Lim 8/12/17

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

Advanced features of Functional Programming (Haskell)

GHCi: Getting started (1A) Young Won Lim 5/26/17

INTRODUCTION TO HASKELL

Haskell Introduction Lists Other Structures Data Structures. Haskell Introduction. Mark Snyder

Haskell & functional programming, some slightly more advanced stuff. Matteo Pradella

Haskell Overview IV (4A) Young Won Lim 10/24/16

Types in Programming Languages Dynamic and Static Typing, Type Inference (CTM 2.8.3, EPL* 4) Abstract Data Types (CTM 3.7) Monads (GIH** 9)

Lecture 8: Summary of Haskell course + Type Level Programming

Programming Paradigms

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

CSCE 314 TAMU Fall CSCE 314: Programming Languages Dr. Flemming Andersen. Haskell Basics

Informatics 1 Functional Programming 19 Tuesday 23 November IO and Monads. Philip Wadler University of Edinburgh

Background Functions (1C) Young Won Lim 4/3/18

Practical Haskell. An introduction to functional programming. July 21, Practical Haskell. Juan Pedro Villa-Isaza. Introduction.

Functional Programming

CS 457/557: Functional Languages

IO Monad (3C) Young Won Lim 8/23/17

According to Larry Wall (designer of PERL): a language by geniuses! for geniuses. Lecture 7: Haskell. Haskell 98. Haskell (cont) - Type-safe!

Applicative, traversable, foldable

Standard prelude. Appendix A. A.1 Classes

Programming Languages

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

D7020E. The dynamic evolution of a system Robust and Energy-Efficient Real-Time Systems. blocked Lecture 2: Components & the Timber language.

D7020E. Robust and Energy-Efficient Real-Time Systems D7020E. Lecture 2: Components & the Timber language

Introduction to Functional Programming in Haskell 1 / 56

CSCE 314 Programming Languages

Monad class. Example: Lambda laughter. The functional IO problem. EDAN40: Functional Programming Functors and Monads

CS 440: Programming Languages and Translators, Spring 2019 Mon

Transcription:

Background Type Classes (1B)

Copyright (c) 2016-2017 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 by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". Please send corrections (or suggestions) to youngwlim@hotmail.com. This document was produced by using OpenOffice.

Based on http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass http://learnyouahaskell.com/functors-applicative-functors-and-monoids Haskell in 5 steps https://wiki.haskell.org/haskell_in_5_steps Type Classes 3

Polymorphism in Haskell The polymorphism features of Haskell Purity -- side effects higher order functions -- function passing and returning parameterized algebraic data types typeclasses http://learnyouahaskell.com/functors-applicative-functors-and-monoids Type Classes 4

Typeclasses Types in Haskell no explicit hierarchy of types similar types can act like each other connect such similar types with the appropriate typeclasses Example: An Int can act like many things like an equatable thing, Eq like an ordered thing, Ord like an enumerable thing, etc. Enum http://learnyouahaskell.com/functors-applicative-functors-and-monoids Type Classes 5

Open Typeclasses Typeclasses are open: can define our own data type, can think about what it can act like can connect it with the typeclasses that define its behaviors. action behavior typeclasses define behaviors that is very general and abstract define behaviors operation of a functions http://learnyouahaskell.com/functors-applicative-functors-and-monoids Type Classes 6

Defining behavior defining behaviors : the type declarations of functions define behaviors operation of a functions general and abstract : A typeclass defintion include the type declarations of functions, define behavior which give a lot of informations about functions connect http://learnyouahaskell.com/functors-applicative-functors-and-monoids Type Classes 7

Typeclass Example Example: typeclasses that define operations for seeing if two things are equal comparing two things by some ordering. very abstract and elegant behaviors, not anything very special because these operations are most common http://learnyouahaskell.com/functors-applicative-functors-and-monoids Type Classes 8

Typeclasses and Instances typeclasses are like interfaces defines some behavior comparing for equality comparing for ordering enumeration such behavior is defined by function definition function type declaration only instances of that typeclass types possessing such behavior a function definition (==) :: a -> a -> Bool - a type declaration x == y = not (x /= y) a function type declaration (==) :: a -> a -> Bool - a type declaration A function definition can be overloaded http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 9

Typeclasses and Type typeclasses are like interfaces defines some behavior comparing for equality comparing for ordering enumeration class AAA bbb where func1 :: a -> b -> c func2 :: b -> c -> a instances of that typeclass types possessing such behavior instance AAA BBB where func1 definition func2 definition a type is an instance of a typeclass implies the function types declared by the typeclass are defined (implemented) in the instance so that the functions can be used, which the typeclass defines with that type http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 10

Instance Example the Eq typeclass defines the functions == and /= a type Car comparing two cars c1 and c2 with the equality function == The Car type is an instance of Eq typeclass Instances : various types Typeclass : a group or a class of these similar types a type Car a type Bag a type Phone instances Eq typeclass functions == and /= http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 11

TrafficLight Type Example (1) class Eq a where (==) :: a -> a -> Bool - a type declaration (/=) :: a -> a -> Bool - a type declaration x == y = not (x /= y) - a function definition x /= y = not (x == y) - a function definition data TrafficLight = Red Yellow Green instance Eq TrafficLight where Red == Red = True Green == Green = True Yellow == Yellow = True _ == _ = False ghci> Red == Red True ghci> Red == Yellow False ghci> Red `elem` [Red, Yellow, Green] True http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 12

TrafficLight Type Example (2) class Show a where show :: a -> String * * * - a type declaration data TrafficLight = Red Yellow Green instance Show TrafficLight where show Red = "Red light" show Yellow = "Yellow light" show Green = "Green light" Instance a type TrafficLight Eq typeclass Show typeclass ghci> [Red, Yellow, Green] [Red light,yellow light,green light] http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 13

Class Constraints class (Eq a) => Num a where... (Eq a) => Eq typeclass class Num a where... instance a class constraint on a class declaration Num typeclass an instance of Eq before being an instance of Num Num : a subclass of Eq the required function bodies can be defined in the class declaration an instance declarations, we can safely use == because a is a part of Eq http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 14

Class Constraints : class & instance declarations class constraints in class declarations to make a typeclass a subclass of another typeclass subclass class (Eq a) => Num a where class constraints in instance declarations to express requirements about the contents of some type. requirements instance (Eq x, Eq y) => Eq (Pair x y) where Pair x0 y0 == Pair x1 y1 = x0 == x1 && y0 == y1 http://cmsc-16100.cs.uchicago.edu/2016/lectures/07-type-classes.php http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 15

Class constraints in instance declaration examples instance (Eq m) => Eq (Maybe m) where Just x == Just y = x == y Nothing == Nothing = True _ == _ = False Eq m instance (Eq x, Eq y) => Eq (Pair x y) where Pair x0 y0 == Pair x1 y1 = x0 == x1 && y0 == y1 Eq (Pair x y) Eq x Eq y Derived instance http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 16

A Concrete Type and a Type Constructor a : a concrete type Maybe : not a concrete type : a type constructor that takes one parameter produces a concrete type. Maybe a : a concrete type http://learnyouahaskell.com/making-our-own-types-and-typeclasses#the-functor-typeclass Type Classes 17

Instance of Eq data TrafficLight = Red Yellow Green to define our own type (defining a new data type) allowed values are Red, Yellow, and Green no class (type) instances class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) class : defining new typeclasses instance : making types instances of a typeclasses instance Eq TrafficLight where Red == Red = True Green == Green = True Yellow == Yellow = True _ == _ = False http://learnyouahaskell.com/making-our-own-types-and-typeclasses Type Classes 18

Instance of Show instance Show TrafficLight where show Red = "Red light" show Yellow = "Yellow light" show Green = "Green light" ghci> Red == Red instance Eq TrafficLight True ghci> Red == Yellow instance Eq TrafficLight False ghci> Red `elem` [Red, Yellow, Green] instance Eq TrafficLight True ghci> [Red, Yellow, Green] instance Show TrafficLight [Red light,yellow light,green light] http://learnyouahaskell.com/making-our-own-types-and-typeclasses Type Classes 19

Instance Maybe m instance Eq Maybe where Maybe is not a concrete type... Maybe m is a concrete type instance Eq (Maybe m) where Just x == Just y = x == y Nothing == Nothing = True _ == _ = False instance (Eq m) => Eq (Maybe m) where Just x == Just y = x == y Nothing == Nothing = True _ == _ = False all types of the form Maybe m to be part of the Eq typeclass, but only those types where the m (what's contained inside the Maybe) is also a part of Eq. http://learnyouahaskell.com/making-our-own-types-and-typeclasses Type Classes 20

Eq, Ord, Show classes Since equality tests between values are frequently used most of your own data types should be members of Eq. Prelude classes Eq Ord Show for the convenience, Haskell has a way to declare such "obvious" instance definitions using the keyword deriving. https://en.wikibooks.org/wiki/haskell/classes_and_types Type Classes 21

Deriving instance example data Foo = Foo {x :: Integer, str :: String} data Foo = Foo {x :: Integer, str :: String} deriving (Eq, Ord, Show) instance Eq Foo where (Foo x1 str1) == (Foo x2 str2) = (x1 == x2) && (str1 == str2) This makes Foo an instance of Eq ith an automatically generated definition of == also an instance of Ord and Show *Main> Foo 3 "orange" == Foo 6 "apple" False *Main> Foo 3 "orange" /= Foo 6 "apple" True deriving (Eq, Ord, Show) https://en.wikibooks.org/wiki/haskell/classes_and_types Type Classes 22

Deriving instance pros and cons The types of elements inside the data type must also be instances of the class you are deriving. Deriving instances synthesis of functions for a limited set of predefined classes against the general Haskell philosophy : "built in things are not special", induces compact codes often reduces errors in coding (an example: an instance of Eq such that x == y would not be equal to y == x would be flat out wrong). https://en.wikibooks.org/wiki/haskell/classes_and_types Type Classes 23

Derivable Classes Eq Equality operators == and /= Ord Comparison operators < <= > >=; min, max, and compare. Enum For enumerations only. Allows the use of list syntax such as [Blue.. Green]. Bounded Also for enumerations, but can also be used on types that have only one constructor. Provides minbound and maxbound as the lowest and highest values that the type can take. Show Defines the function show, which converts a value into a string, and other related functions. Read Defines the function read, which parses a string into a value of the type, and other related functions. https://en.wikibooks.org/wiki/haskell/classes_and_types Type Classes 24

Functors, Applicatives, Monads functors: applicatives: monads: you apply a function to a wrapped value you apply a wrapped function to a wrapped value you apply a function that returns a wrapped value, to a wrapped value functors: using fmap or <$> applicatives: using <*> or lifta monads: using >>= or liftm https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 25

Functors Functors use the fmap or <$> functions fmap :: Functor f => (a -> b) -> f a -> f b <$> :: Functor f => (a -> b) -> f a -> f b This takes a function and applies to to the wrapped elements fmap (\x -> x + 1) (Just 1) -- Applies (+1) to the inner value, returning (Just 2) fmap (\x -> x + 1) Nothing -- Applies (+1) to an empty wrapper, returning Nothing fmap (\x -> x + 1) [1, 2, 3] -- Applies (+1) to all inner values, returning [2, 3, 4] (\x -> x + 1) <$> [1, 2, 3] -- Same as above [2, 3, 4] https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 26

Applicatives Applicatives use the <*> function: <*> :: Applicative f => f (a -> b) -> f a -> f b This takes a wrapped function and applies it to the wrapped elements (Just (\x -> x + 1)) <*> (Just 1) -- Returns (Just 2) (Just (\x -> x + 1)) <*> Nothing -- Returns Nothing Nothing <*> (Just 1) -- Returns Nothing [(*2), (*4)] <*> [1, 2] -- Returns [2, 4, 4, 8] https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 27

Monads return There are two relevant functions in the Monad typeclass: return :: Monad m => a -> m a (>>=) :: Monad m => m a -> (a -> m b) -> m b The return function takes a raw, unwrapped value, and wraps it up in the desired monadic type. makejust :: a -> Maybe a makejust x = return x let foo = makejust 10 -- returns (Just 10) https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 28

Monads bind The bind function lets you temporarily unwrap the inner elements of a Monad and pass them to a function that performs some action that wraps them back UP in the same monad. This can be used with the return function in trivial cases: [1, 2, 3, 4] >>= (\x -> return (x + 1)) -- Returns [2, 3, 4, 5] (Just 1) >>= (\x -> return (x + 1)) -- Returns (Just 2) Nothing >>= (\x -> return (x + 1)) -- Returns Nothing https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 29

Monads a binding operand functions to chain together that don't require to use return. getline :: IO String putstrln :: String -> IO () -- return String type value as a result function call examples getline >>= (\x -> putstrln x) getline >>= putstrln -- gets a line from IO and prints it to the console -- with currying, this is the same as above https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 30

Monads a chain of functions functions to chain together that don't require to use return. getline :: IO String putstrln :: String -> IO () read :: Read a => String -> a show :: Show a => a -> String -- return String type value as a result -- composite function examples -- reads a line from IO, converts to a number, adds 10 and prints it getline >>= (return. read) >>= (return. (+10)) >>= putstrln. show String a a String -> () getline >>= (return. read) >>= (return. (+10)) >>= putstrln. show https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 31

Promises and Mediators the concept of promises (particularly in Javascript) A promise is an object that acts as a placeholder for the result value of an asynchronous, background computation, P1 fifo P2 like fetching some data from a remote service. promise it serves as a mediator between the asynchronous computation and functions that need to operate on its anticipated result. Act Behavior Operation Define Connect https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 32

Map a function over a promise A mediator allows us to say what function should apply to the result of a background task, before that task has completed. P1 map promise function P2 When you map a function over a promise, the value that your function should apply to may not have been computed yet and in fact, if there is an error somewhere it may never be computed. https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 33

Chaining a function onto a promise Promise libraries usually support a functorial/monadic API where you can chain a function onto a promise, which produces another promise P1 map promise function P2 that produces the result of applying that function to the original promise's result. the value of the functor/monad interface Promises allow you to say what function should apply to the result of a background task, map promise function P2 before that task has completed. https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 34

Interfaces think functor/applicative/monad as interfaces for mediator objects that sit in between functions and arguments, and connect them indirectly according to some policy. P1 map promise function P2 The simplest way to use a function is just to call it with some arguments; controls when and how many times the function will be called what to do with its result. First-class functions A higher-order function is a function that takes other functions as arguments or returns a function as result. https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 35

Interfaces with first-class functions if you have first-class functions, you have other, indirect options you can supply the function to a mediator object that will control when and how many times the function will be called, and what to do with its result. P1 map function promise controls P2 when and how many times the function will be called what to do with its result. First-class functions A higher-order function is a function that takes other functions as arguments or returns a function as result. https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 36

Promises and Mediators Promises call the functions supplied to them when the result of some background task is completed The results of those functions are then handed over to other promises that are waiting for them. P1 map promise function P2 call functions that was received as arguments hand over the results https://softwareengineering.stackexchange.com/questions/303472/what-is-the-purpose-of-wrapped-values-in-haskell Type Classes 37

General Monad - MonadPlus Haskell's Control.Monad module defines a typeclass, MonadPlus, that enables abstract the common pattern eliminating case expressions. class Monad m => MonadPlus m where mzero :: m a mplus :: m a -> m a -> m a class (Monad m) => MonadPlus m where instance MonadPlus [] where mzero = [] mplus = (++) instance MonadPlus Maybe where mzero = nothing nothing `mplus` ys = ys xs `mplus` _ = xs http://book.realworldhaskell.org/read/programming-with-monads.html Type Classes 38

General Monad - MonadPlus Laws The class MonadPlus is used for monads that have a zero element and a plus operation: class (Monad m) => MonadPlus m where mzero :: m a mplus :: m a -> m a -> m a For lists, the zero value is [], the empty list. The I/O monad has no zero element and is not a member of this class. m >>= \x -> mzero = mzero mzero >>= m = mzero The zero element laws: m `mplus` mplus = m mplus `mplus` m = m The laws governing the mplus operator The mplus operator is ordinary list concatenation in the list monad. http://book.realworldhaskell.org/read/programming-with-monads.html Type Classes 39

Functional Dependency (fundep) class class Mult a b -> c where (*) :: a -> b -> c c is uniquely determined from a and b. Fundeps are not standard Haskell 98. (Nor are multi-parameter type classes, for that matter.) They are, however, supported at least in GHC and Hugs and will almost certainly end up in Haskell'. class class Mult where (*) :: a -> b -> c https://wiki.haskell.org/functional_dependencies Type Classes 40

Purity Some functional languages allow expressions to yield actions in addition to return values. These actions are called side effects to emphasize that the return value is the most important result of a function Pure languages prohibit side effects but some impure functional languages have pure subsets and is also useful It is usually beneficial to write a significant part of a code as pure and the remaining impure part as small as possible because the impure code which involves state and I/O is more prone to errors. https://wiki.haskell.org/functional_programming#purity Type Classes 41

Immutable data Pure functional programs typically operate on immutable data. Instead of altering existing values, altered copies are created and the original is preserved. Since the unchanged parts of the structure cannot be modified, they can often be shared between the old and new copies, which saves memory. https://wiki.haskell.org/functional_programming#purity Type Classes 42

Referential Transparency Pure computations yield the same value each time they are invoked. -- no side effects This property is called referential transparency and makes possible to conduct equational reasoning on the code. For instance if y = f x and g = h y y then we should be able to replace the definition of g with g = h (f x) (f x) and get the same result; only the efficiency might change. https://wiki.haskell.org/functional_programming#purity Type Classes 43

Lazy Evaluation Since pure computations are referentially transparent they can be performed at any time and still yield the same result. This makes it possible to defer the computation of values until they are needed, that is, to compute them lazily. Lazy evaluation avoids unnecessary computations and allows, for example, infinite data structures to be defined and used. https://wiki.haskell.org/functional_programming#purity Type Classes 44

Purity and Effects Even though purely functional programming is very beneficial, the programmer might want to use features that are not available in pure programs, like efficient mutable arrays or convenient I/O. There are two approaches to this problem. https://wiki.haskell.org/functional_programming#purity Type Classes 45

Side effects in the language Some functional languages extend their purely functional core with side effects. The programmer must be careful not to use impure functions in places where only pure functions are expected. https://wiki.haskell.org/functional_programming#purity Type Classes 46

Side effects through monads (1) Another way of introducing side effects to a pure language is to simulate them using monads. While the language remains pure and referentially transparent, monads can provide implicit state by threading it inside them. The compiler does not even have to 'know' about the imperative features because the language itself remains pure, however usually the implementations do 'know' about them due to the efficiency reasons, for instance to provide O(1) mutable arrays. https://wiki.haskell.org/functional_programming#purity Type Classes 47

Side effects through monads (2) Allowing side effects only through monads and keeping the language pure makes it possible to have lazy evaluation that does not conflict with the effects of impure code. Even though lazy expressions can be evaluated in any order, the monad structure forces the effects to be executed in the correct order. https://wiki.haskell.org/functional_programming#purity Type Classes 48

References [1] ftp://ftp.geoinfo.tuwien.ac.at/navratil/haskelltutorial.pdf [2] https://www.umiacs.umd.edu/~hal/docs/daume02yaht.pdf