Я моделирую систему, в которой есть операция, которая создает ресурс и другие операции, которые потребляют этот ресурс. Однако данный ресурс можно использовать только один раз - есть ли способ, которым я могу гарантировать, что во время компиляции?
Для конкретности, скажем, первая операция выпекает торт и что есть еще две операции: одна для "выбора еды" торта, а другая для "выбора пирога" и что я могу сделать только один или другие.
-- This is my current "weakly typed" interface:
bake :: IO Cake
eat :: Cake -> IO ()
keep :: Cake -> IO ()
-- This is OK
do
brownie <- bake
muffin <- bake
eat brownie
keep muffin
-- Eating and having the same cake is not OK:
do
brownie <- bake
eat brownie
keep brownie -- oops! already eaten!
Его легко обеспечить соблюдение ограничения не хранить уже съеденный торт (или наоборот) во время выполнения, установив флаг на торт после его использования. Но есть ли способ обеспечить это во время компиляции?
Кстати, этот вопрос предназначен для доказательства концепции, поэтому я в порядке с любой черной магией, которая может дать мне статическую безопасность, которую я хочу.