Выпустил новую версию 1.0.4.0 библиотеки моделирования Aivika на F#. В прежней версии обнаружил ошибку в реализации блоков try-finally и try-with для вычислительного выражения dynamicscont. По своей сути это частный случай монадного трансформера, построенного на основе продолжения. Дело в том, что фактически надо хранить два продолжения, а не одно. Первое продолжение используется для основной ветки вычислений. Второе продолжение - для обработки исключительных ситуаций.
Обновленный тип выглядит так:
type DynamicsCont<'a> = Dynamics<('a -> unit) * (exn -> unit)> -> Dynamics<unit>
Выводится из следующего типа Cont с учетом одного упрощения, характерного именно для монадного типа Dynamics:
type Cont<'a> = ('a -> unit) * (exn -> unit) -> unit
Здесь функция от двух продолжений: основного потока вычислений и обработчика ошибок. Особенность заключается в том, что монадический переход bind должен быть защищен в узком месте блоком try. В случае возникновения ошибки должно активироваться второе продолжение для обработки ошибок.
Сначала я составил необходимые функции для Cont. Потом сверил с реализацией стандартного async. Убедился, что все правильно. Затем перенес на тип DynamicsCont.
Если есть интерес, то я мог бы написать эти функции для Cont. В интернете такой информации не видел. Там обычно рассматривается упрощенный случай из одного продолжения, не учитывающий обработку блоков try.
Комментариев нет:
Отправить комментарий