ghosts of depareted proofs?
GADTs?
Самый простой вариант: data PossiblyInvalid data Valid data WhatWentWrong parse :: PossiblyInvalid -> Either WhatWentWrong Valid lookMaNoGuards :: Valid -> IO ()
если речь о типе, представляющем число в фиксированном диапазоне, то это вроде называется refinement types, и есть 2 основных подхода к ним: 1) обернуть обычное число в newtype и валидировать его на входе. 2) придумать такое представление, любое значение в котором взаимно однозначно соответствует объекту из домена
а если много вычислений внутри алгоритма. т.е. данные приходят валидные, но их легко повредить во время работы. добавление смарт конструктора - это, получается, тот же гард, который проверяется в рантайме
Можно с помощью тайпчекера подоказывать, что преобразования не ломают инварианты, для этого есть завтипы (в Haskell поддерживается частично с помощью расширений), рефайнменты в реализации Liquid Haskell, и подход/библиотека ghosts of departed proofs Но это всё довольно муторно
Если возможно выделить набор заведомо сохраняющих инварианты операций, можно из них составить eDSL, и тогда любая программа на нём будет корректной без лишних проверок
а есть какой-то инженерно-прагматичный материал по теме?
Насчёт материалов не уверен, но могу попытаться ответить на вопросы, если они есть
Обсуждают сегодня