Генрих здесь. Типы Pulse
и Latch
, вероятно, лучше всего рассматривать как «леммы», которые я придумал и которые очень полезны для реализации типов Event
и Behavior
. Я уверен, что они окажутся полезными при попытке более формально обосновать реализацию, но это огромный исследовательский проект, и я не нашел ни времени, ни ресурсов для этого.
Тип Pulse
почти такой же, как Event
, за исключением того, что все функции должны иметь монадический тип, например
mapP :: (a → b) → Pulse a → Build (Pulse b)
-- vs
mapE :: (a → b) → Event a → Event b
Тип Event
реализуется путем избавления от монады Build
с помощью черной магии (= наблюдаемое разделение). Имя Build
звучит как служебная монада, что так и есть, если вы посмотрите на код, но эта монада также является фундаментальной, потому что она имеет семантическую интерпретацию как «момент времени», и не очевидно, почему вы можете иногда удалить ее , а иногда и нет.
Тип Latch
также очень похож на Behavior
, за исключением того, что последний также включает Event
из прагматических соображений. Аналогичные соображения применимы и к монаде Build
.
Надеюсь, это ответит на больше вопросов, чем вызовет. ???? Извините, что я не могу более подробно рассказать о внутренней работе реактивного банана, это выходит за рамки ответа StackOverflow.
person
Heinrich Apfelmus
schedule
29.08.2017