Я наткнулся на язык эффектов и идею алгебраических c эффектов. Но я не уверен, правильно ли я понял концепцию. Я попытался повторно реализовать basi c "hello world" example in Python и придумал следующее:
import contextlib
import contextvars
handlers = contextvars.ContextVar('handlers', default={})
def effect(name, *args, **kwargs):
try:
return handlers.get()[name](*args, **kwargs)
except KeyError:
raise RuntimeError(f'No handler for effect {name}')
@contextlib.contextmanager
def handle(**kwargs):
token = handlers.set(dict(**handlers.get(), **kwargs))
try:
yield
finally:
handlers.reset(token)
def example():
n = 0
produce = True
while produce:
produce = effect('Yield', n)
n += 1
return n
with handle(Yield=lambda n: n < 3):
example()
Мой вопрос: может ли этот фрагмент квалифицироваться как эффект правильной алгебры c? Если нет, то в чем я ошибаюсь?