Hello,
I am new not only to Haskell, but to programming in general. I
hope that I am posting in the correct forum.
I am working through "Practical Web Development With Haskell" by
Ecky Putrady (2018), New York: Apress, and I am having some
difficulty understanding the STM portion of Chapter three. More
specifically, I cannot get the following code snippet to return
the expected result in the REPL:
-- snippet from
Adapter.InMemory.Auth module as composed on pages 53-64 in the
book
import ClassyPrelude
import qualified Domain.Auth as D -- as composed on pages 35-52
in the book
import Conrol.Monad.Except
import Text.StringRandom
import Data.Has
-- ...
data State = State
{ stateAuths :: [(D.UserId, D.Auth)]
-- ...
initialState :: State
initialState = State
{ stateAuths = []
-- ...
type InMemory r m = (Has (TVar State) r, MonadReader r m,
MonadIO m)
addAuth :: InMemory r m
=> D.Auth -> m (Either D.RegistrationError
D.VerificationCode)
addAuth auth = do
tvar <- asks getter
-- ... rest of function
These are the instructions for
"Verification in REPL" provided on page 64 of the book:
> :l
Adapter.InMemory.Auth
> let email = D.mkEmail "ecky@test.com"
> let passw = D.mkPassword "1234ABCDefgh"
> let auth = either undefined id $ D.Auth <$> email
<*> passw
> s <- newTVarIO initialState
> addAuth s auth
Calling the addAuth function is
supposed to print the following:
Right "aBNhtG653Bga9kas"
-- (or whatever random vCode stringRandomIO generates)
However, GHCI instead tells me:
<interactive>:6.9:
error:
* Couldn't match expected type 'D.Auth'
with actual type 'TVar State'
* In the first argument of 'addAuth', namely 's'
In the expression: addAuth s auth
-- ...
The source code for the book at
https://github.com/Apress/practical-webdev-haskell was created
with stack resolver lts-9.11, while I am using resolver lts-14.11.
I am doing this intentionally, because debugging the compilation
errors helps guide me to become more familiar with the
documentation in the packages being implemented, as well as
helping me to understand general Haskell concepts little by
little. I have tried looking through the changelogs for the stm
and classy-prelude packages on https://hackage.haskell.org, for
any clues which would be intelligible to me (an extremely
restrictive constraint, admittedly), that would help me understand
why the addAuth function thinks the TVar State we pass to it
should be a D.Auth, and why this presumably would not have been
the case had I built the project with the lts-9.11 resolver, but I
have not been able to understand it thus far.