docs / Getting Started / Imports & Modules

Imports & Modules

Miri supports a module system that resolves imports, enforces visibility across module boundaries, and detects errors like circular dependencies and namespace collisions.

Import syntax

// Import all public entities from a module
use system.io

// Selective import
use system.io.{print, println}

// Module aliasing
use system.collections.list as L

// Multiple aliases in one statement
use system.{io, collections.map as M}

// Import from local project files
use local.models.user
use local.utils.math

Standard library modules

ModuleContents
system.ioprint, println, eprint, eprintln
system.stringString class with intrinsics
system.mathabs, min, max, pow, sqrt, floor, ceil, round, sin, cos, tan, log, exp, PI, E, INF
system.resultResult<T, E> with is_ok, is_err, unwrap_or
system.testingassert, assert_eq, assert_ne, assert_panics
system.collections.arrayArray methods + Queryable/Transformable/Foldable/Sequenced traits
system.collections.listList methods + Queryable/Transformable/Foldable/Sequenced traits
system.collections.mapMap methods + ad-hoc map/filter/reduce
system.collections.setSet methods + ad-hoc map/filter/reduce

Cross-module visibility

Visibility modifiers (public, private, protected) are enforced across module boundaries. Top-level functions and classes are public by default. Accessing a private symbol from another module produces a compile error.

// utils/helper.mi
public fn add(a int, b int) int
    a + b

private fn internal_detail() int
    42

// main.mi
use local.utils.helper

fn main()
    let x = add(1, 2)         // OK — add is public
    // internal_detail()       // Error — private to its module

Error detection

  • Namespace collisions — Importing two modules that export the same name produces a compile error with suggestions for resolution (e.g., using aliased imports).
  • Circular dependencies — If module a.mi imports b.mi and b.mi imports a.mi, the compiler reports the circular import chain with clear diagnostics.