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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Introduction to Haskell

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

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

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

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

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

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

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

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

Logic Haskell Exercises

JVM ByteCode Interpreter

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

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

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

A Brief Haskell and GHC Refresher

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

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

Programming Languages

Lecture 8: Summary of Haskell course + Type Level Programming

Programming in Haskell Aug Nov 2015

Haske k ll An introduction to Functional functional programming using Haskell Purely Lazy Example: QuickSort in Java Example: QuickSort in Haskell

CS 11 Haskell track: lecture 1

An introduction introduction to functional functional programming programming using usin Haskell

CS 360: Programming Languages Lecture 12: More Haskell

Advanced Programming Handout 7. Monads and Friends (SOE Chapter 18)

More on functional programming

Overview. Declarative Languages. General monads. The old IO monad. Sequencing operator example. Sequencing operator

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

CS 457/557: Functional Languages

(Refer Slide Time: 4:00)

6.001 Notes: Section 8.1

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

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

Programming Languages and Techniques (CIS120)

Applicative, traversable, foldable

An introduction to functional programming. July 23, 2010

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

About the Tutorial. Audience. Prerequisites. Copyright & Disclaimer. Haskell Programming

Set Haskell Exercises

Overloading, Type Classes, and Algebraic Datatypes

Programming Paradigms

Applicative, traversable, foldable

CIS 194: Homework 3. Due Wednesday, February 11, Interpreters. Meet SImPL

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

CS 440: Programming Languages and Translators, Spring 2019 Mon

Haskell Monads CSC 131. Kim Bruce

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

Advanced Topics in Programming Languages Lecture 2 - Introduction to Haskell

Typed Scheme: Scheme with Static Types

CSCE 314 Programming Languages. Interactive Programming: I/O

Typed Racket: Racket with Static Types

Programming with Math and Logic

CMSC 330: Organization of Programming Languages. Formal Semantics of a Prog. Lang. Specifying Syntax, Semantics

State Monad Examples (6C) Young Won Lim 9/26/18

College Functors, Applicatives

Lecture: Functional Programming

The Complexity of Algorithms (3A) Young Won Lim 4/3/18

State Monad Examples (6C) Young Won Lim 9/22/18

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

Pointers (1A) Young Won Lim 1/9/18

Pointers (1A) Young Won Lim 1/5/18

Lecture 19: Functions, Types and Data Structures in Haskell

Programming Languages Fall 2013

Haskell An Introduction

The List Datatype. CSc 372. Comparative Programming Languages. 6 : Haskell Lists. Department of Computer Science University of Arizona

OBJECT ORIENTED PROGRAMMING USING C++ CSCI Object Oriented Analysis and Design By Manali Torpe

Haskell Refresher Informatics 2D

Accessibility (1A) Young Won Lim 8/22/13

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

Principles of Programming Languages

COMP3151/9151 Foundations of Concurrency Lecture 8

A Sudoku Solver (1A) Richard Bird Implementation. Young Won Lim 11/15/16

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

References. Monadic I/O in Haskell. Digression, continued. Digression: Creating stand-alone Haskell Programs

CS 360: Programming Languages Lecture 10: Introduction to Haskell

Transcription:

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 Haskell in 5 steps https://wiki.haskell.org/haskell_in_5_steps 3

A List Comprehension Function let removelower x = [c c <- x, c `elem` ['A'..'Z']] a list comprehension Hello removelower x [ c c <- x, c `elem` ['A'..'Z'] ] [ c: H c: e c: l c: l c: o ] H do { x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } x1 : Return value of action1 x2: Return value of action2 https://stackoverflow.com/questions/35198897/does-mean-assigning-a-variable-in-haskell 4

Pattern and Predicate let removelower x = [c c <- x, c `elem` ['A'..'Z']] a list comprehension [c c <- x, c `elem` ['A'..'Z']] c <- x is a generator (x : argument of the function removelower) List [ c c <- x, c `elem` ['A'..'Z'] ] a list an element c is a pattern matching from the elements of the list x successive binding of c to the elements of the list x c `elem` ['A'..'Z'] is a predicate which is applied to each successive binding of c Only c which passes this predicate will appear in the output list https://stackoverflow.com/questions/35198897/does-mean-assigning-a-variable-in-haskell 5

Assignment in Haskell Assignment in Haskell : declaration with initialization: no uninitialized variables, must declare with an initial value no mutation a variable keeps its initial value throughout its scope. https://stackoverflow.com/questions/35198897/does-mean-assigning-a-variable-in-haskell 6

Generator [c c <- x, c `elem` ['A'..'Z']] filter (`elem` ['A'.. 'Z']) x [ c c <- x ] do c <- x return c c: an element x: a list action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 )) x >>= ( \c -> return c ) c: an element x: an element or c: a list x: a list x >>= return https://stackoverflow.com/questions/35198897/does-mean-assigning-a-variable-in-haskell 7

Anonymous Functions (\x -> x + 1) 4 5 :: Integer (\x y -> x + y) 3 5 8 :: Integer inc1 = \x -> x + 1 inclista lst = map inc2 lst where inc2 x = x + 1 inclistb lst = map (\x -> x + 1) lst inclistc = map (+1) https://wiki.haskell.org/anonymous_function 8

Then Operator (>>) and do Statements a chain of actions to sequence input / output operations the (>>) (then) operator works almost identically in do notation putstr "Hello" >> putstr " " >> putstr "world!" >> putstr "\n" do { putstr "Hello" ; putstr " " ; putstr "world!" ; putstr "\n" } https://en.wikibooks.org/wiki/haskell/do_notation 9

Chaining in do and >> notations do { action1 ; action2 ; action3 } action1 action2 action3 do { action1 ; do { action2 ; action3 } } action1 >> do { action2 ; action3 } can chain any actions all of which are in the same monad do { action1 ; do { action2 ; do { action3 } } } action1 >> action2 >> action3 https://en.wikibooks.org/wiki/haskell/do_notation 10

Bind Operator (>==) and do statements The bind operator (>>=) passes a value -> (the result of an action or function), downstream in the binding sequence. do notation assigns a variable name to the passed value using the <- action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 )) do { x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } anonymous function (lambda expression) is used https://en.wikibooks.org/wiki/haskell/do_notation 11

Chaining >>= and do notations -> <- action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 )) action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 )) do { x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } action1 >>= (\ x1 -> action2 >>= (\ x2 -> mk_action3 x1 x2 )) action1 x1 action2 x2 mk_action3 https://en.wikibooks.org/wiki/haskell/do_notation 12

fail method do { Just x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } do { x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } O.K. when action1 returns Just x1 when action1 returns Nothing crash with an non-exhaustive patterns error Handling failure with fail method action1 >>= f where f (Just x1) = do { x2 <- action2 ; mk_action3 x1 x2 } f _ = fail "..." -- A compiler-generated message. https://en.wikibooks.org/wiki/haskell/do_notation 13

Example namedo :: IO () namedo = do { putstr "What is your first name? " ; first <- getline ; putstr "And your last name? " ; last <- getline ; let full = first ++ " " ++ last ; putstrln ("Pleased to meet you, " ++ full ++ "!") } do { x1 <- action1 ; x2 <- action2 ; mk_action3 x1 x2 } using the do statement A possible translation into vanilla monadic code: namelambda :: IO () namelambda = putstr "What is your first name? " >> getline >>= \ first -> putstr "And your last name? " >> getline >>= \ last -> let full = first ++ " " ++ last in putstrln ("Pleased to meet you, " ++ full ++ "!") using then (>>) and Bind (>>=) operators https://en.wikibooks.org/wiki/haskell/do_notation 14

return method namereturn :: IO String namereturn = do putstr "What is your first name? " first <- getline putstr "And your last name? " last <- getline let full = first ++ " " ++ last putstrln ("Pleased to meet you, " ++ full ++ "!") return full greetandseeyou :: IO () greetandseeyou = do name <- namereturn putstrln ("See you, " ++ name ++ "!") https://en.wikibooks.org/wiki/haskell/do_notation 15

Without a return method namereturn :: IO String namereturn = do putstr "What is your first name? " first <- getline putstr "And your last name? " last <- getline let full = first ++ " " ++ last putstrln ("Pleased to meet you, " ++ full ++ "!") return full explicit return statement returns IO String monad namedo :: IO () namedo = do { putstr "What is your first name? " ; first <- getline ; putstr "And your last name? " ; last <- getline ; let full = first ++ " " ++ last ; putstrln ("Pleased to meet you, " ++ full ++ "!") } no return statement returns empty IO monad https://en.wikibooks.org/wiki/haskell/do_notation 16

return method not a final statement namereturnandcarryon :: IO () namereturnandcarryon = do putstr "What is your first name? " first <- getline putstr "And your last name? " last <- getline let full = first++" "++last putstrln ("Pleased to meet you, "++full++"!") return full putstrln "I am not finished yet!" the return statement does not interrupt the flow the last statements of the sequence returns a value https://en.wikibooks.org/wiki/haskell/do_notation 17

Data Constructor data Color = Red Green Blue Color is a type Red Green Blue is a constructor that contains a value of type Color. is a constructor that contains a value of type Color. is a constructor that contains a value of type Color. https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 18

Data Constructor with Parameters data Color = RGB Int Int Int Color RGB is a type is not a value but a function taking three Int s and returning a value RGB :: Int -> Int -> Int -> Color RGB is a data constructor that is a function taking three Int values as its arguments, and then uses them to construct a new value. https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 19

Type Constructor Consider a binary tree to store Strings data SBTree = Leaf String Branch String SBTree SBTree a type SBTree Leaf Branch is a type is a data constructor (a function) is a data constructor (a function) Leaf :: String -> SBTree Branch :: String -> SBTree -> SBTree -> SBTree https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 20

Similar Type Constructors Consider a binary tree to store Strings data SBTree = Leaf String Branch String SBTree SBTree Consider a binary tree to store Bool data BBTree = Leaf Bool Branch Bool BBTree BBTree Consider a binary tree to store a parameter type data BTree a = Leaf a Branch a (BTree a) (BTree a) https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 21

Type Constructor with a Parameter Type constructors Both SBTree and BBTree are type constructors data SBTree = Leaf String Branch String SBTree SBTree data BBTree = Leaf Bool Branch Bool BBTree BBTree data BTree a = Leaf a Branch a (BTree a) (BTree a) Now we introduce a type variable a as a parameter to the type constructor. BTree has become a function. It takes a type as its argument and it returns a new type. https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 22

Type Constructors and Data Constructors A type constructor a "function" that takes 0 or more types gives you back a new type. type SBTree = BTree String type BBTree = BTree Bool Type constructors with parameters allows slight variations in types A data constructor a "function" that takes 0 or more values gives you back a new value. Data constructors with parameters allows slight variations in values RGB 12 92 27 #0c5c1b RGB 255 0 0 RGB 0 255 0 RGB 0 0 255 https://stackoverflow.com/questions/18204308/haskell-type-vs-data-constructor 23

( ) ( ) is both a type and a value. ( ) is a special type, pronounced unit, has one value ( ), sometimes pronounced void the unit type has only one value which is called unit. ( ) :: ( ) Type :: Expression It is the same as the void type void in Java or C/C++. https://stackoverflow.com/questions/20380465/what-do-parentheses-used-on-their-own-mean 24

Unit Type a unit type is a type that allows only one value (and thus can hold no information). It is the same as the void type void in Java or C/C++. :t Expression :: Type data Unit = Unit Prelude> :t Unit Unit :: Unit Prelude> :t () () :: () https://stackoverflow.com/questions/20380465/what-do-parentheses-used-on-their-own-mean 25

Type Language and Expression Language data Tconst Tvar Tvar = Vconst type type Vconst type type A new datatype declaration Tconst (Type Constructor) Vconst (Value Constructor) is added to the type language is added to the expression language and its pattern sublanguage must not appear in types Argument types in Vconst type type are the types given to the arguments (Tconst Tvar Tvar) are used in expressions https://stackoverflow.com/questions/16892570/what-is-in-haskell-exactly 26

Datatype Declaration Examples data Tree a = Leaf Node (Tree a) (Tree a) data Type = Value Tree Leaf or Node (Type Constructor) (Value Constructor) data ( ) = ( ) ( ) (Type Constructor) ( ) (Value Constructor) the type (), often pronounced "Unit" the value (), sometimes pronounced "void" the type () containing only one value () https://stackoverflow.com/questions/16892570/what-is-in-haskell-exactly 27

Functional & Imperative Languages Imperative programming: variables as changeable locations in a computer's memory imperative programs explicitly commands the computer what to do functional programming a way to think in higher-level mathematical terms defining how variables relate to one another leaving the compiler to translate these to the step-by-step instructions that the computer can process. https://en.wikibooks.org/wiki/haskell/variables_and_functions 28

Haskell Language Features Haskell Functional Programming Immutability Recursive Definition No Data Dependency https://en.wikibooks.org/wiki/haskell/variables_and_functions 29

Redefinition : not allowed imperative programming: after setting r = 5 and then changing it to r = 2. Hakell programming: an error: "multiple declarations of r". Within a given scope, a variable in Haskell r = 5 r = 2 r = 5 r = 2 No mutation In Haskell gets defined only once and cannot change, like variables in mathematics. Immutable: They can change only based on the data we enter into a program. We can't define r two ways in the same code, but we could change the value by changing the file https://en.wikibooks.org/wiki/haskell/variables_and_functions 30

Variable definition in a file Var1.hs Var2.hs r = 5 r = 55 definition with initialization young@sys ~ $ ghci GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Prelude> :load Var1.hs [1 of 1] Compiling Main ( var.hs, interpreted ) Ok, modules loaded: Main. *Main> r 5 *Main> :t r r :: Integer *Main> *Main> :load Var2.hs [1 of 1] Compiling Main ( var2.hs, interpreted ) Ok, modules loaded: Main. *Main> r 55 https://en.wikibooks.org/wiki/haskell/variables_and_functions 31

No Mutation Var1.hs Var2.hs r = 5 r = 55 No mutation *Main> r = 33 <interactive>:12:3: parse error on input = young@sys ~ $ ghci GHCi, version 7.10.3: http://www.haskell.org/ghc/ :? for help Prelude> r = 333 <interactive>:2:3: parse error on input = Prelude> let r = 33 https://en.wikibooks.org/wiki/haskell/variables_and_functions 32

Recursive Definition imperative programming: r = r + 1 incrementing the variable r (updating the value in memory) Hakell programming: a recursive definition of r (defining it in terms of itself) if r had been defined with any value beforehand, then r = r + 1 in Haskell would bring an error message. https://en.wikibooks.org/wiki/haskell/variables_and_functions 33

No Data Dependence y = x * 2 x = 3 x = 3 y = x * 3 Hakell programming: because their values of variables do not change within a program variables can be defined in any order there is no notion of "x being declared before y" or the other way around. https://en.wikibooks.org/wiki/haskell/variables_and_functions 34

Evaluation area 5 => { replace the LHS area r =... by the RHS... = pi * r^2 } pi * 5 ^ 2 => { replace pi by its numerical value } 3.141592653589793 * 5 ^ 2 => { apply exponentiation (^) } 3.141592653589793 * 25 => { apply multiplication (*) } 78.53981633974483 area r = pi * r^2 replace each function with its definition calculate the results until a single value remains. to apply or call a function means to replace the LHS of its definition by its RHS. https://en.wikibooks.org/wiki/haskell/variables_and_functions 35

Pure Languages Haskell is a pure language programs are made of functions that can't change any global state or variables, they can only do some computations and return them results. every variable's value does not change in time However, some problems are inherently stateful in that they rely on some state that changes over time. a bit tedious to model Haskell has the state monad features http://learnyouahaskell.com/for-a-few-monads-more 36

Stateful Computation a stateful computation is a function that takes some state and returns a value along with some new state. That function would have the following type: s -> (a,s) s is the type of the state and a the result of the stateful computation. http://learnyouahaskell.com/for-a-few-monads-more 37

Assignment as a stateful computation Assignment in other languages could be thought of as a stateful computation. x = 5 in an imperative language : will assign the value 5 to the variable x will have the value 5 as an expression in a functional language as a function that takes a state and returns a result and a new state an input state : all the variables that have been assigned previously a result : 5 a new state : all the previous variable mappings plus the newly assigned variable. http://learnyouahaskell.com/for-a-few-monads-more 38

A value with a context The stateful computation: a function that takes a state and returns a result and a new state can be considered as a value with a context the actual value is the result the context is that we have to provide some initial state to get the result and that apart from getting the result we also get a new state. http://learnyouahaskell.com/for-a-few-monads-more 39

Monadic Effect class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b https://en.wikibooks.org/wiki/haskell/understanding_monads/io https://stackoverflow.com/questions/2488646/why-are-side-effects-modeled-as-monads-in-haskell https://stackoverflow.com/questions/7840126/why-monads-how-does-it-resolve-side-effects https://stackoverflow.com/questions/2488646/why-are-side-effects-modeled-as-monads-in-haskell https://www.cs.hmc.edu/~adavidso/monads.pdf 40

Monadic Operation Monadic operations tend to have types which look like val-in-type-1 ->... -> val-in-type-n -> effect-monad val-out-type where the return type is a type application: put :: s -> (State s) ( ) putstr :: String -> IO () the function tells you which effects are possible and the argument tells you (val-out-type) what sort of value is produced by the operation https://stackoverflow.com/questions/16892570/what-is-in-haskell-exactly 41

Monadic Operation put, putstr put :: s -> State s ( ) put :: s -> (State s) ( ) one value input type s the effect-monad State s the value output type ( ) the operation is used only for its effect; the value delivered is uninteresting putstr :: String -> IO () delivers a string to stdout but does not return anything exciting. https://stackoverflow.com/questions/16892570/what-is-in-haskell-exactly 42

Side Effects of IO Monad Generally, a monad cannot perform side effects in Haskell. there is one exception: IO monad putstr :: String -> IO () Suppose there is a type called World, which contains all the state of the external universe A way of thinking what IO monad does World -> (t, World) type IO t = World -> (t, World) type synonym World (t, World) IO t is a parameterized function input : a World output: a value of the type t and a new, updated World obtained by modifying the given World in the process of computing the value of the type t. World IO x world0 IO t (t, World) (x, world1) https://www.cs.hmc.edu/~adavidso/monads.pdf 43

Side Effects of IO Monad Generally, a monad cannot perform side effects in Haskell. there is one exception: IO monad putstr :: String -> IO () Suppose there is a type called World, which contains all the state of the external universe A way of thinking what IO monad does type IO t = World -> (t, World) type synonym World -> (t, World) World (t, World) IO t World (t, World) https://www.cs.hmc.edu/~adavidso/monads.pdf 44

Type Synonym IO t IO t is a parameterized function input : a World output: a value of the type t and a new, updated World obtained by modifying the given World in the process of computing the value of the type t. type IO t = World -> (t, World) type synonym World IO t (t, World) world0 (x, world1) (x, world1) = IO x world0 https://www.cs.hmc.edu/~adavidso/monads.pdf 45

Side Effects of IO Monad type IO t = World -> (t, World) type synonym World -> (t, World) World (t, World) IO t World (t, World) (x, world1) = IO x world0 https://www.cs.hmc.edu/~adavidso/monads.pdf 46

Implementation of IO t It is impossible to store the extra copies of the contents of your hard drive that each of the Worlds contains given World updated World https://www.cs.hmc.edu/~adavidso/monads.pdf 47

IO Monad Implementation instance Monad IO where return x world = (x, world) (iox >>= f) world0 = let (x, world1) = iox world0 in f x world1 -- has type (t, World) (x,s) (x,s ) (y,s ) type IO t = World -> (t, World) type synonym x World iox (t, World) t World f (t, World) world0 (x, world1) world1 (y, world1) f x world1 https://www.cs.hmc.edu/~adavidso/monads.pdf 48

Monad IO and Monad ST instance Monad IO where return x world = (x, world) (iox >>= f) world0 = let (x, world1) = iox world0 in f x world1 -- has type (t, World) instance Monad ST where -- return :: a -> ST a return x = \s -> (x,s) -- (>>=) :: ST a -> (a -> ST b) -> ST b st >>= f = \s -> let (x,s') = st s in f x s' type IO t = World -> (t, World) type synonym https://www.cs.hmc.edu/~adavidso/monads.pdf 49

State Transformers ST instance Monad ST where -- return :: a -> ST a return x = \s -> (x,s) -- (>>=) :: ST a -> (a -> ST b) -> ST b st >>= f = \s -> let (x,s') = st s in f x s' st >>= f = \s -> f x s' where (x,s') = st s st >>= f = \s -> (y,s') where (x,s') = st s (y,s') = f x s' >>= provides a means of sequencing state transformers: st >>= f applies the state transformer st to an initial state s, then applies the function f to the resulting value x to give a second state transformer (f x), which is then applied to the modified state s' to give the final result: (x,s') = st s f x s' https://cseweb.ucsd.edu/classes/wi13/cse230-a/lectures/monads2.html 50

Monad IO - return The return function takes x and gives back a function that takes a World and returns x along with the new, updated World (=World) formed by not modifying the World it was given return x world = (x, world) x return World (x, World). https://www.cs.hmc.edu/~adavidso/monads.pdf 51

Monad IO - >>= the expression (iox >>= f) has the implementation of bind type World -> (t, World) a function iox that takes world0 of the type World, which is used to extract x from its IO monad. x gets passed to f, resulting in another IO monad, which again is a function that takes world1 of the type World and returns a y and a new, updated World. x World iox (t, World) t World f (t, World) world0 (x, world1) world1 (y, world1) f x world1 https://www.cs.hmc.edu/~adavidso/monads.pdf 52

Side Effects in Haskell We give it the World the implementation of bind we got back the World from getting x out of its monad, and the thing it gives back to us is the y with a final version of the World. (t,world) (t,world) (t,world) (x,world0) (x,world1) (y,world1) https://www.cs.hmc.edu/~adavidso/monads.pdf 53

Side Effects in Haskell Which World was given initially? Which World was updated? The modification of the World In GHC, a main must be defined somewhere with type IO () a program execution starts from the main the initial World is contained in the main to start everything off the main passes the updated World from each IO to the next IO as its initial World an IO that is not reachable from main will never be executed an initial / updated World is not passed to such an IO the initial World IO 1 st updated World IO 2 nd updated World IO 3 rd updated World https://www.cs.hmc.edu/~adavidso/monads.pdf 54

Side Effects in Haskell when using GHCI, everything is wrapped in an implicit IO, since the results get printed out to the screen. the implementation of bind Every time a new command is given to GHCI, GHCI passes the current World, GHCI gets the result of the command back, GHCI request to display the result (which updates the World by modifying the contents of the screen or the list of defined variables or current World IO only 1 World updated World the list of loaded modules or whatever), and then saves the new World to give to the next command. https://www.cs.hmc.edu/~adavidso/monads.pdf 55

Side Effects in Haskell when using GHCI, everything is wrapped in an implicit IO, since the results get printed out to the screen. the implementation of bind there s only 1 World in existence at any given moment. Each IO takes that one and only World, consumes it, and gives back a single new World. Consequently, there s no way to accidentally run out of Worlds, or have multiple ones running around. current World IO only 1 World updated World https://www.cs.hmc.edu/~adavidso/monads.pdf 56

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