# Mutability / side effects

**URL:** <https://discourse.haskell.org/t/mutability-side-effects/4899>\
**Category:** Learn\
**Created:** [August 7, 2022, 5:02pm UTC](https://discourse.haskell.org/t/mutability-side-effects/4899 "2022-08-07T17:02:46Z")\
**Posts on this page:** 1\
**Showing post:** 6

<div class="post-metadata">

**Author:** ![jaror](https://sea2.discourse-cdn.com/flex002/user_avatar/discourse.haskell.org/jaror/32/3271_2.png) [@jaror](https://discourse.haskell.org/u/jaror)\
**Post date:** [August 7, 2022, 9:36pm UTC](https://discourse.haskell.org/t/mutability-side-effects/4899/6 "2022-08-07T21:36:37Z")

</div>

> [@atravers](#):
>
> then the OP could then just look at the underlying imperative code

I’m a bit confused. Doesn’t abstraction mean that the definition is hidden and inaccesible? Why would a definition of IO via the FFI like that count as an abstraction?

As per the usual definition of abstraction in Haskell, the `IO` type is abstract in the sense that its definition is only exported from internal modules (although those are annoyingly not obviously marked as such).

If you want proper abstractions, I would suggest using backpack and writing everything as modules that are parameterized over an IO signature.

---

_[View the full topic](https://discourse.haskell.org/t/mutability-side-effects/4899)._
