Typestate в Rust: как сделать невозможные состояния непредставимыми

Functional State Machines in Rust: Typestate and Newtype Patterns

Статья разбирает паттерны typestate и newtype в Rust для реализации конечных автоматов на уровне типов. Автор показывает, как с их помощью можно гарантировать корректность переходов между состояниями на этапе компиляции, исключая целые классы ошибок. Рассматриваются практические примеры, преимущества и ограничения подхода, а также сравнение с альтернативными методами.

Typestate позволяет перенести проверку корректности переходов конечного автомата с этапа выполнения на этап компиляции, делая невозможные состояния непредставимыми.
  1. vatsachak

    Типы — это головоломки. Хороший растаман позаботится о том, чтобы кусочки подходили друг к другу и складывались в картинку.

    Именно поэтому в крейтах, где мне нужно гарантировать, что определённые функции вызываются в правильном порядке, я использую Ticket<T>: одна функция возвращает Ticket<Func1Done> с результатом, а другая обязана принять его на вход.

    Типстейт-паттерн — это частный случай представления только допустимых состояний.

  2. doyougnu

    Это был доклад на воркшопе FUNARCH на конференции ICFP в этом году.

    Вот прямая трансляция: https://www.youtube.com/live/c0pw1iVs_Q0?is=hwm2xa4cZOcqF5tW

    В ближайшие дни мы выложим отдельные доклады!

  3. arpinum

    Я активно использую типстейты и новые типы (newtypes). Метрика, показывающая их пользу: сколько вызовов методов или параметров могут быть скомпилированы, но не являются допустимыми сценариями использования. Нужно минимизировать это число. Мне нравится иметь такое состояние типа, при котором можно вызвать только один или два метода, потому что состояние ограничивает доступные методы парсинга, валидации или перехода. И существует только один правильный способ передать параметры — я не могу перепутать строки местами. Единственное, чего мне не хватает — именованных параметров как в Objective-C.

  4. michaelnoguera

    PDF: https://dl.acm.org/doi/pdf/10.1145/3830438.3830958

  5. bana-io

    Возможно, я что-то упускаю, но где весь исходный код?

Ещё за этот день

2026-08-29