Functional Programmers Need to Take a Look at Zig

· coding · Source ↗

TLDR

  • A 10-year Haskell veteran argues Zig’s comptime replicates typeclasses, sum types, and monadic IO patterns without a GC.

Key Takeaways

  • Zig’s comptime enables newtypes, sum types (union(enum)), and typeclass-style dispatch via structs, approximating Haskell’s type-system programming.
  • The author frames Zig’s Io interface pattern (allocator + io injected via Init) as independently arriving at the Reader/IO monad design.
  • Three evaluation axes used: expressiveness (low noise), correct-by-construction type programming, and “mean-free path” – lines before a semantic surprise.
  • Author argues GC languages optimize for 1995-era machines; CPU compute has grown ~10,000x since then while memory latency has not, making arena/allocator patterns increasingly valuable.
  • Zig’s explicit allocator passing and arena encouragement are cited as why Zig programs exploit modern memory hierarchies better than GC languages.

Hacker News Comment Review

  • Core technical dispute: whether Zig’s Io qualifies as a monad at all – commenters note it is dependency injection and nothing prevents storing a global io object, undermining the monadic framing.
  • Commenters pushed back on the GC-causes-bloat claim as weak causation; slow software is attributed to incentives and culture, not GC semantics directly.
  • Practical adoption concern raised: Zig pre-1.0 means significant rewrites between releases, making it risky for any reasonably sized project today.

Notable Comments

  • @dnautics: “io is not a monad” – argues it’s dependency injection; FP enthusiasts will be disappointed if they expect genuine FP semantics.
  • @continuational: Contrasts verbose Zig Maybe boilerplate directly against data Maybe a = Just a | Nothing, questioning whether the ergonomics tradeoff is worthwhile.
  • @dev_l1x_be: Flags pre-1.0 instability – new Zig releases may require rewriting significant portions of existing codebases.

Original | Discuss on HN