Cats Effect IO (Scala)
Quick start
- •Treat every side effect as an effect value: return
IO[A],SyncIO[A], orF[A]withF[_]: Sync/Async/Temporalas needed. - •Wrap Java blocking calls with
IO.blockingorIO.interruptible(orSync[F].blocking/interruptible). - •Use
Resourceto acquire/release resources andIOAppfor program entry points. - •Prefer structured concurrency (
parTraverse,parMapN,background,Supervisor) over manual fiber management. - •Read
references/cats-effect-io.mdfor concepts, recipes, and FAQ guidance. - •For deeper
Resourceguidance, use thecats-effect-resourceskill (install:npx skills add https://github.com/alexandru/skills --skill cats-effect-resource).
Workflow
- •Classify side effects and choose the effect type:
IOdirectly or polymorphicF[_]with the smallest required Cats Effect typeclass (Sync,Async,Temporal,Concurrent). - •Wrap side-effectful code using
IO(...),IO.blocking,IO.interruptible, orIO.async(or theirSync/Asyncequivalents). - •Manage resources with
Resourceorbracketand keep acquisition/release inside effects. - •Compose effects with
flatMap/for-comprehensions and collection combinators (traverse,parTraverse). - •Use concurrency primitives (
Ref,Deferred,Queue,Semaphore,Supervisor) and structured concurrency to avoid fiber leaks.
Side-effect rules (apply to IO, SyncIO, and to F[_]: Sync/Async)
- •All side-effectful functions must return results wrapped in
IO(orF[_]with Cats Effect typeclasses). - •Side-effects include all non-determinism (call sites are not referentially transparent):
- •Any I/O (files, sockets, console, databases).
- •
Instant.now(),Random.nextInt(). - •Any read from shared mutable state (the read itself is the side effect).
- •Returning mutable data structures (for example,
Array[Int]).
Blocking I/O rules
- •Java blocking methods must be wrapped in
IO.blockingorIO.interruptible(orSync[F].blocking/interruptible) so they run on the blocking pool. - •Prefer
IO.interruptiblefor methods that may throwInterruptedExceptionorIOException, but not for resource disposal. - •Use
IO.blockingfor cleanup/disposal (Closeable#close,AutoCloseable#close).
Output expectations
- •Make side effects explicit in signatures (
IO/SyncIOorF[_]: Sync/Async); the guidance here applies equally to concreteIOand polymorphicF[_]. - •Use the smallest typeclass constraint that supports the needed operations.
- •Keep effects as values; do not execute effects in constructors or top-level vals.
References
- •Load
references/cats-effect-io.mdfor documentation summary and patterns. - •For concrete samples, read
references/cats-effect-io.md. - •Use the
cats-effect-resourceskill for Resource-specific workflows and patterns (install:npx skills add https://github.com/alexandru/skills --skill cats-effect-resource).