Best use case
free-monad-gen is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Free Monad Generation Skill (PLUS +1)
Teams using free-monad-gen should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
$curl -o ~/.claude/skills/free-monad-gen/SKILL.md --create-dirs "https://raw.githubusercontent.com/plurigrid/asi/main/ies/music-topos/.codex/skills/free-monad-gen/SKILL.md"
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/free-monad-gen/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How free-monad-gen Compares
| Feature / Agent | free-monad-gen | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Free Monad Generation Skill (PLUS +1)
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Free Monad Generation Skill (PLUS +1)
> Free structure generation from signatures
**Trit**: +1 (PLUS)
**Color**: #D82626 (Red)
**Role**: Generator/Creator
## Core Concept
Free monads generate structure from a functor signature:
```haskell
data Free f a
= Pure a -- Leaf (return)
| Roll (f (Free f a)) -- Node (bind)
```
**Universal property**: `Free f` is left adjoint to forgetful functor U.
## Dual: Cofree Comonad
```haskell
data Cofree f a = a :< f (Cofree f a)
-- Head (extract) and infinite tail (duplicate)
```
| Free | Cofree |
|------|--------|
| Producer (effects) | Consumer (contexts) |
| Programs | Interpreters |
| Syntax | Semantics |
## Pattern Runs on Matter
```
Pattern (Free) ────runs-on────→ Matter (Cofree)
↓ ↑
Program Environment
↓ ↑
Effects Handlers
```
## Integration with Gay.jl
```julia
# Free monad for color stream generation
struct ColorFree{A}
tag::Symbol # :pure or :roll
value::Union{A, Tuple{UInt64, ColorFree{A}}}
end
# Generate free color structure
function free_color_stream(seed::UInt64, n::Int)
if n == 0
ColorFree(:pure, seed)
else
next_seed = splitmix64(seed)
ColorFree(:roll, (seed, free_color_stream(next_seed, n-1)))
end
end
# Interpret to actual colors
function interpret(free::ColorFree, palette)
if free.tag == :pure
return []
else
(seed, rest) = free.value
color = gay_color(seed)
[color; interpret(rest, palette)]
end
end
```
## Freer Monad (More Efficient)
```haskell
data Freer f a where
Pure :: a -> Freer f a
Impure :: f x -> (x -> Freer f a) -> Freer f a
```
Benefits:
- O(1) bind (vs O(n) for Free)
- Existential continuation
- Better for effect systems
## DSL Generation Pattern
```haskell
-- 1. Define signature functor
data MusicF next
= Note Pitch Duration next
| Rest Duration next
| Chord [Pitch] Duration next
| Par (Free MusicF ()) (Free MusicF ()) next
-- 2. Free monad gives DSL
type Music = Free MusicF
-- 3. Smart constructors
note :: Pitch -> Duration -> Music ()
note p d = liftF (Note p d ())
-- 4. Programs are data
melody = do
note C4 quarter
note E4 quarter
note G4 half
```
## GF(3) Triads
```
sheaf-cohomology (-1) ⊗ kan-extensions (0) ⊗ free-monad-gen (+1) = 0 ✓
temporal-coalgebra (-1) ⊗ dialectica (0) ⊗ free-monad-gen (+1) = 0 ✓
three-match (-1) ⊗ unworld (0) ⊗ free-monad-gen (+1) = 0 ✓
```
## Commands
```bash
# Generate free structure from signature
just free-gen MusicF
# Interpret free structure
just free-interpret music.free synth
# Generate color stream
just free-color-stream $GAY_SEED 100
# Lift effect to free monad
just free-lift effect
```
## Effect System Integration
```haskell
-- Algebraic effects as free monads
data Effect =
| State s
| Reader r
| Writer w
| Async
| Error e
type Eff effs = Freer (Union effs)
-- Handlers interpret effects
runState :: s -> Eff (State s ': effs) a -> Eff effs (a, s)
```
## References
- Swierstra, "Data Types à la Carte"
- Kiselyov & Ishii, "Freer Monads, More Extensible Effects"
- Capriotti & Kaposi, "Free Applicatives"Related Skills
We are still matching the closest adjacent skills for this page. In the meantime, continue through the full directory.