54 lines
1.1 KiB
Markdown
54 lines
1.1 KiB
Markdown
# Haskell Effects with ReaderT and Except
|
|
|
|
This note covers `10-haskell-effects/`, which models application logic with an environment, explicit errors, and a small effect stack.
|
|
|
|
---
|
|
|
|
## 1. What the Stack Represents
|
|
|
|
The example uses:
|
|
|
|
- `ReaderT Env` for read-only configuration, and
|
|
- `Except AppError` for failures that belong to the domain.
|
|
|
|
That is an important intermediate step because it separates three things cleanly:
|
|
|
|
- configuration,
|
|
- business logic, and
|
|
- error handling.
|
|
|
|
---
|
|
|
|
## 2. Why the Functions Use Constraints
|
|
|
|
The library functions are written against `MonadReader Env` and `MonadError AppError` constraints rather than a concrete stack type.
|
|
|
|
That keeps the functions reusable. They say what capabilities they need, not exactly which monad stack must provide them.
|
|
|
|
The concrete stack still exists:
|
|
|
|
```haskell
|
|
type App = ReaderT Env (Except AppError)
|
|
```
|
|
|
|
But the function signatures stay more flexible and easier to test.
|
|
|
|
---
|
|
|
|
## 3. Commands to Try
|
|
|
|
```bash
|
|
cd 10-haskell-effects
|
|
|
|
nix develop
|
|
cabal run
|
|
cabal run -- haskell
|
|
cabal test
|
|
|
|
nix build
|
|
./result/bin/mini-effects haskell
|
|
|
|
nix run . -- haskell
|
|
nix flake check
|
|
```
|