You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

66 lines
1.5 KiB

# 22 Reader
## 22.2 Short Exercise: Warming up
[src/warmingup.hs](./src/warmingup.hs)
## 22.5 Excercise: Ask
[src/ask.hs](./src/ask.hs)
## 22.6 Exercise: Reading Comprehension
[src/readingcomp.hs](./src/readingcomp.hs)
## 22.7 Exercise: Reader Monad
[src/readingcomp.hs](./src/readingcomp.h)
## 22.9 You can change what comes below, but not above
Trying to understand the following quote:
> You can swap in a different type or value of `r` for function that you call,
> but not for functions that call you.
Perhaps a better way of saying this would be:
> You can can choose the input for a function you are calling, but cannot
> change the input from within the function.
The input being the context of a `Reader`. This makes sense, consider:
`f :: a -> b`
When we call `f`, we can choose any input value or type to use. However, within
`f`, the value and type are fixed. Immutable. The same applies of course for
`Reader a b` as this is just a `newtype` for `f`.
```haskell
f :: Reader Integer String
f = do
r <- ask
-- we cannot change r, but we can do operations on them
return $ show (r * r)
-- However, we can change the input for f when we call it:
g :: Reader Integer String
g = do
r <- ask
-- either via:
-- return $ runReader f (r + 1)
-- or:
withReader (+1) f
```
## 22.11 Chapter exercises
### A warmup stretch
[src/ReaderPractise.hs](./src/ReaderPractise.hs)
### Rewriting Shawty
No idea if this is what was requested, but it works:
[shawty-prime/app/Main.hs](./shawty-prime/app/Main.hs)