Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in...
-
Upload
truongduong -
Category
Documents
-
view
241 -
download
2
Transcript of Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in...
![Page 1: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/1.jpg)
L09-1
Imperative Programming in Haskell?
Armando Solar-Lezama
Computer Science and Artificial Intelligence Laboratory
MIT With content from Nirav Dave (used with permission) and
examples from Dan Piponi’s great blog Post “You could have invented Monads! And Maybe You Already Have”
http://blog.sigfpe.com/2006/08/you-could-have-invented-monads-and.html
© Dan Piponi. All rights reserved. This content is excluded from our Creative Commons
license. For more information, see http://ocw.mit.edu/help/faq-fair-use/.
October 7, 2015
October 7, 2015
![Page 2: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/2.jpg)
L09-2
Debuggable Functions
• Suppose you want your function to produce some debug output in addition to computation – e.g. plusone’ x = (x+1 , “added one”)
square’ x = (x*x , “squared”)
– convenient but…
• How do you compose two such functions? – (plusone’ (square’ x)) doesn’t type check the way
(plusone (square x)) would.
• Composition just became a pain – let (y,s) = square’ x
(z,t) = plusone’ y in (z , s ++ t)
October 7, 2015
square’
plusone’
++
![Page 3: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/3.jpg)
L09-3
Debuggable Functions
• Make a function to facilitate this – bind:: (Int->(Int, String))->(Int, Sting)->(Int, String)
– bind f (x,y) = let (u,v) = f(x) in (u, y++v)
• Ex. – (bind square’)
– (bind plusone’)
– (bind square’) ((bind plusone’) (x, “”) )
October 7, 2015
![Page 4: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/4.jpg)
L09-4
Debuggable Functions
• Two more useful functions – unit x = (x, “”)
– lift f x = unit (f x)
– (*) f g = (bind f) . (g) = \x ((bind f) (g x))
• Some useful identities – unit * f = f * unit = f
– lift f * lift g = lift (f . g)
October 7, 2015
![Page 5: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/5.jpg)
L09-5
Random Numbers
• Consider the “function” rand() – Not really a function, but you can make it a
function
• rand: StdGen->(int, StdGen) – think of StdGen as the seed that gets updated
(or as some infinitely long list of pre-generated random numbers)
• A randomized function a->a is really a -> StdGen -> (a, StdGen)
October 7, 2015
![Page 6: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/6.jpg)
L09-6
Composing Randomized Functions
• Again, composing randomized functions is a pain
• We can define a form of bind – Recall the pattern from before
• bind :: (a -> something) -> something -> something
– So we can do this for randomized functions
• bind:: (a -> StdGen -> (a, StdGen))-> (StdGen -> (a, StdGen))->(StdGen -> (a, StdGen))
• bind f x seed = let (x',seed') = x seed in f x' seed'
October 7, 2015
![Page 7: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/7.jpg)
L09-7
Randomized Functions
• Ex. – plusrand x seed = let (rv, seed’) = random seed
in (x + rv , seed’ )
– timesrand x seed = let (rv, seed’) = random seed in (x * rv , seed’ )
• Let’s say I want 5 * rnd + rnd – (bind plusrand) ( (bind timesrand) ?? )
• unit – unit :: a -> something
– unit :: a -> (StdGen -> (b, StdGen))
– unit x g = (x,g)
– (bind plusrand) ( (bind timesrand) (unit 5) )
October 7, 2015
![Page 8: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/8.jpg)
L09-8
Lift and composition
• We can again define – lift f x = unit (f x)
– (*) f g = (bind f) . g
• And again it is true that – unit * f = f * unit = f
– lift f * lift g = lift (f . g)
October 7, 2015
![Page 9: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/9.jpg)
L09-9
Monads as a type class
• Monad is a typeclass that requires – x >>= f
• (>>=) :: something->(a->something)->something
• (equivalent to bind f x)
– return x
• return :: a -> something
• (equivalent to unit x)
– etc.
• So in the rand example – (bind plusrand) ( (bind timesrand) (unit 5) )
becomes
– (return 5) >>= timesrand >>= plusrand
October 7, 2015
![Page 10: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/10.jpg)
L09-10
Monad definition
• (m a), (m b) correspond to something
• Eg. – type MyRand a = StdGen -> (a, StdGen)
October 7, 2015
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
![Page 11: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/11.jpg)
L09-11
Monadic Laws
• They operators are expected to satisfy some rules – Left Identity:
• return a >>= f ⇔ f a
• i.e. unit * f = f
– Right Identity
• m >>= return ⇔ m
• i.e. f*unit = f
– Associativity
• (m >>= f) >>= g ⇔ m >>= (\x -> f x >>= g)
October 7, 2015
![Page 12: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/12.jpg)
L09-12
do syntactic sugar for Monads
do e e
do p <- e ; dostmts e >>= \p-> do dostmts
do e ; dostmts e >>= \_-> do dostmts
do let p=e ; dostmts let p=e in do dostmts
October 7, 2015
(return 5) >>= timesrand >>= plusrand
do x <- return 5;
y <- timesrand x;
plusrand y
![Page 13: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/13.jpg)
L09-13
do syntactic sugar for Monads
do e e
do p <- e ; dostmts e >>= \p-> do dostmts
do e ; dostmts e >>= \_-> do dostmts
do let p=e ; dostmts let p=e in do dostmts
October 7, 2015
do x <- return 5;
y <- timesrand x;
plusrand y
return 5 >>= \x (do y <- timesrand x;
plusrand y)
![Page 14: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/14.jpg)
L09-14
do syntactic sugar for Monads
do e e
do p <- e ; dostmts e >>= \p-> do dostmts
do e ; dostmts e >>= \_-> do dostmts
do let p=e ; dostmts let p=e in do dostmts
October 7, 2015
return 5 >>= \x (do y <- timesrand x;
plusrand y)
return 5 >>= \x (timesrand x >>= \y do plusrand y)
![Page 15: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/15.jpg)
L09-15
do syntactic sugar for Monads
do e e
do p <- e ; dostmts e >>= \p-> do dostmts
do e ; dostmts e >>= \_-> do dostmts
do let p=e ; dostmts let p=e in do dostmts
October 7, 2015
return 5 >>= \x (timesrand x >>= \y do plusrand y)
return 5 >>= \x (timesrand x >>= \y plusrand y)
Int->MyRand Int
![Page 16: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/16.jpg)
L09-16
do syntactic sugar for Monads
October 7, 2015
return 5 >>= \x (timesrand x >>= \y do plusrand y)
return 5 >>= \x (timesrand x >>= \y plusrand y)
Int->MyRand Int
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
MyRand Int
MyRand Int
Int -> MyRand Int
![Page 17: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/17.jpg)
L09-17
IO with Monads
October 7, 2015
![Page 18: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/18.jpg)
L09-18
Word Count Program
September 29, 2010
wc :: String -> (Int,Int,Int)
wcs :: String -> Bool -> (Int,Int,Int)
-> (Int,Int,Int)
wc cs = wcs cs False (0,0,0)
wcs [] inWord (nc,nw,nl) = (nc,nw,nl)
wcs (c:cs) inWord (nc,nw,nl) =
if (isNewLine c) then
wcs cs False ((nc+1),nw,(nl+1))
else if (isSpace c) then
wcs cs False ((nc+1),nw,nl)
else if (not inWord) then
wcs cs True ((nc+1),(nw+1),nl)
else
wcs cs True ((nc+1),nw,nl)
Flag to indicate we are inside a word
![Page 19: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/19.jpg)
L09-19
Word Count Program
September 29, 2010
wc :: String -> (Int,Int,Int)
wcs :: String -> Bool -> (Int,Int,Int)
-> (Int,Int,Int)
wc cs = wcs cs False (0,0,0)
wcs [] inWord (nc,nw,nl) = (nc,nw,nl)
wcs (c:cs) inWord (nc,nw,nl) =
if (isNewLine c) then
wcs cs False ((nc+1),nw,(nl+1))
else if (isSpace c) then
wcs cs False ((nc+1),nw,nl)
else if (not inWord) then
wcs cs True ((nc+1),(nw+1),nl)
else
wcs cs True ((nc+1),nw,nl)
Suppose we want to read the string from an input file
Flag to indicate we are inside a word
![Page 20: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/20.jpg)
L09-20
File Handling Primitives
September 29, 2010
type Filepath = String
data IOMode = ReadMode | WriteMode | ...
data Handle = ... implemented as built-in type openFile :: FilePath -> IOMode -> Handle
hClose :: Handle -> () -- void
hIsEOF :: Handle -> Bool
hGetChar :: Handle -> Char
These operations are not pure functions because each causes a side-effect. For example, (hGetChar h) should produce
different answers if performed twice
![Page 21: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/21.jpg)
L09-21
Reading a File - First Attempt
September 29, 2010
getFileContents :: String -> String
getFileContents filename =
let h = openFile filename ReadMode
reversed_cs = readFileContents h []
() = hClose h
in (reverse reversed_cs)
readFileContents :: Handle -> String -> String
readFileContents h rcs =
if (not (hIsEOF h))
then “”
else readFileContents h ((hGetChar h):rcs)
Bogus sequential code; no way to model or control side-effects
![Page 22: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/22.jpg)
L09-22
Ugly, yes, but may still be okay
• Issue: If we rely on strict execution, this cannot be simplified
let unused = bigComputation input
in 2
• To this…
2
September 29, 2010
![Page 23: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/23.jpg)
L09-23 October 26, 2006 http://www.csg.csail.mit.edu/6.827
Monads: A Review
Monad is a type class with the following operations class (Monad m) where
-- embedding
return :: a -> m a
-- sequencing
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
Monads let us lift a normal computation into a computational context and selectively access the context through primitive actions
![Page 24: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/24.jpg)
L09-24
Monadic I/O
• By embedding the concept of I/O in a monad we guarantee that there is a single sequence of the monadic I/O operations (no nondeterminism issues)
• Unlike other monads, there is no way to make an IO a into an a
September 29, 2010
IO a: computation which does some I/O, producing a value of type a.
No operation to take a value out of an IO
![Page 25: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/25.jpg)
L09-25
Monadic I/O
September 29, 2010
type Filepath = String
data IOMode = ReadMode | WriteMode | ...
data Handle = ... implemented as built-in type openFile :: FilePath -> IOMode -> IO Handle
hClose :: Handle -> IO ()
hIsEOF :: Handle -> IO Bool
hGetChar :: Handle -> IO Char
getFileContents :: String -> IO String
getFileContents filename =
do h <- openFile filename ReadMode
reversed_cs <- readFileContents h []
hClose h
return (reverse reversed_cs)
readFileContents :: Handle -> String -> IO String
readFileContents h rcs =
do b <- hIsEOF h
if (not b) then return []
else do c <- hGetChar h
readFileContents h (c:rcs)
reading a file
Primitives
![Page 26: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/26.jpg)
L09-26
Monadic vs bogus code
September 29, 2010
getFileContents :: String -> IO String
getFileContents filename =
do h <- openFile filename ReadMode
reversed_cs <- readFileContents h []
hClose h
return (reverse reversed_cs)
getFileContents filename =
let h = openFile filename ReadMode
reversed_cs = readFileContents h []
() = hClose h
in (reverse reversed_cs)
Contrast
![Page 27: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/27.jpg)
L09-27
Monadic printing: an example
September 29, 2010
print filename (nc,nw,nl) =
do
putStr “ ”
putStr (show nc)
putStr “ ”
putStr (show nw)
putStr “ ”
putStr (show nl)
putStr “ ”
putStr filename
putStr “\n”
print :: String -> (Int,Int,Int) -> IO ()
no return !
![Page 28: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/28.jpg)
L09-28
Word Count using monads - version 1
September 29, 2010
main = do
(filename:_) <- getArgs
contents <- getFileContents filename
let (nc,nw,nl) = wc contents
print filename (nc,nw,nl)
What if we wanted to compute wc as we read the file ?
pure functional program
main = do
(filename:_) <- getArgs
contents <- getFileContents filename
(nc,nw,nl) <- return (wc contents)
print filename (nc,nw,nl)
versus
![Page 29: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/29.jpg)
L09-29
Monadic Word Count Program version 2
September 29, 2010
wc filename =
do
h <- openFile filename ReadMode
(nc,nw,nl) <- wch h False (0,0,0)
hClose h
return (nc,nw,nl)
file name
wch :: Handle -> Bool -> (Int,Int,Int)
-> IO (Int,Int,Int)
wcs :: String -> Bool -> (Int,Int,Int)
-> (Int,Int,Int)
wc :: String -> IO (Int,Int,Int)
![Page 30: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/30.jpg)
L09-30
Monadic Word Count Program
cont.
September 29, 2010
wch :: Handle -> Bool -> (Int,Int,Int)
-> IO (Int,Int,Int)
wch h inWord (nc,nw,nl) =
do eof <- hIsEOF h
if eof then return (nc,nw,nl)
else do
c <- hGetChar h
if (isNewLine c) then
wch h False ((nc+1),nw,(nl+1))
else if (isSpace c) then
wch h False ((nc+1),nw,nl)
else if (not inWord) then
wch h True ((nc+1),(nw+1),nl)
else
wch h True ((nc+1),nw,nl)
![Page 31: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/31.jpg)
L09-31
Beyond I/O
• Monadic I/O is a clever way to force meaningful interactions with the outside world. This is what most people think of when they think of monads
• But monads can do more – A mechanism to structure computation
– A way to “thread information” through a program
September 29, 2010
![Page 32: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/32.jpg)
L09-32
Fib: Functional vs Monadic Style
fib :: Int -> Int
fib n =
if (n<=1) then n
else
let
n1 = n - 1
n2 = n - 2
f1 = fib n1
f2 = fib n2
in f1 + f2
September 29, 2010
fib :: (Monad m) => Int -> m Int
fib n =
if (n<=1) then return n
else
do
n1 <- return (n-1)
n2 <- return (n-2)
f1 <- fib n1
f2 <- fib n2
return (f1+f2)
- monadic fib will work inside any other monadic computation! - note the awkward style: everything must be named because computations cannot be inlined!
![Page 33: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/33.jpg)
L09-33
Limitations: The Modularity Problem
September 29, 2010
Inserting a print (say for debugging):
sqrt :: Float -> IO Float
sqrt x =
let ...
a = (putStrLn ...) :: IO ()
in do a
return result
Without the do binding has no effect; the I/O has to be exposed to the caller:
One print statement changes the whole structure of the program!
http://www.csg.csail.mit.edu/6.827
![Page 34: Imperative Programming in Haskell? - MIT OpenCourseWare · L09-1 . Imperative Programming in Haskell? Armando Solar-Lezama Computer Science and Artificial Intelligence Laboratory](https://reader033.fdocuments.net/reader033/viewer/2022052407/5b4b188d7f8b9a35228b7470/html5/thumbnails/34.jpg)
MIT OpenCourseWare
http://ocw.mit.edu
6.820 Fundamentals of Program AnalysisFall 2015
For information about citing these materials or our Terms of Use, visit: http://ocw.mit.edu/terms.