Skip to content
Yet Another Nix Type System
Branch: master
Clone or download
Latest commit 5f6b51c Sep 19, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
screenshots chore: Change file layout to match repository instead of gist Aug 28, 2019
.travis.yml fix: Bump Nix in CI setup to 2.2.2 Aug 29, 2019 chore: Add contribution & code of conduct information Aug 28, 2019
LICENSE chore: Add Apache License 2.0 Aug 28, 2019 docs(README): Add usage information to README Sep 14, 2019
default.nix feat: add n-ary either Sep 19, 2019
tests.nix test: add eitherN test Sep 19, 2019


Build Status

This is a tiny type-checker for data in Nix, written in Nix.


  • Checking of primitive types (int, string etc.)
  • Checking polymorphic types (option, list, either)
  • Defining & checking struct/record types
  • Defining & matching enum types
  • Defining & matching sum types
  • Defining function signatures (including curried functions)
  • Types are composable! option string! list (either int (option float))!
  • Type errors also compose!

Currently lacking:

  • Any kind of inference
  • Convenient syntax for attribute-set function signatures

Primitives & simple polymorphism




Nested structs!

nested structs






Yants can be imported from its default.nix. A single attribute (lib) can be passed, which will otherwise be imported from <nixpkgs>.

Examples for the most common import methods would be:

  1. Import into scope with with:

    with (import ./default.nix {});
    # ... Nix code that uses yants ...
  2. Import as a named variable:

    let yants = import ./default.nix {};
    in yants.string "foo" # or other uses ...
  3. Overlay into pkgs.lib:

    # wherever you import your package set (e.g. from <nixpkgs>):
    import <nixpkgs> {
      overlays = [
        (self: super: {
          lib = super.lib // { yants = import ./default.nix { inherit (super) lib; }; };
    # yants now lives at lib.yants, besides the other library functions!

Please see my Nix one-pager for more generic information about the Nix language and what the above constructs mean.


The current API of Yants is not yet considered stable, but it works fine and should continue to do so even if used at an older version.

Yants' tests use Nix versions above 2.2 - compatibility with older versions is not guaranteed.

You can’t perform that action at this time.