Is there any way to take "things" out of a monad?
I am developing a game, and I am now trying to understand about databases. I found happstack
really nice, but I can't get the thing.
For example, I have this function (hope you are familiar with happstack
)
getAllThings :: MonadIO m => m [Thing]
getAllThings = do
elems <- query GetThings
return elems
So I get m [Things]
, but I can't use this in my model! For instance
doSomeThingWithThings :: [Thing] -> Something
I googled this and I found nothing.
A monad is an algebraic structure in category theory, and in Haskell it is used to describe computations as sequences of steps, and to handle side effects such as state and IO. Monads are abstract, and they have many useful concrete instances. Monads provide a way to structure a program.
So, the Haskell bind takes a value enclosed in a monad, and returns a function, which takes a function and then calls it with the extracted value.
The Maybe type is also a monad. It is a simple kind of error monad, where all errors are represented by Nothing . A richer error monad can be built using the Either type.
Lists are a fundamental part of Haskell, and we've used them extensively before getting to this chapter. The novel insight is that the list type is a monad too! As monads, lists are used to model nondeterministic computations which may return an arbitrary number of results.
You are not supposed to exit IO monad this way (except unsafePerformIO
function), but you can still use your function inside it:
process :: MonadIO m => m ()
process = do
elems <- getAllThings
let smth = doSomeThingWithThings elems
-- ...
After elems <- query GetThings
the elems is [Thing]
so <-
inside do is about getting things out of monad (called bind operation). The last statement return
put things inside a monad. So either you can call you other function after getting elems and before return
or where ever you are calling getAllThings
you can use extract the value using <-
from the monad and pass it to your function
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With