Так как натрий был deprecated автором Я пытаюсь передать свой код в реактивный банан. Тем не менее, кажется, что есть некоторые несоответствия между этими двумя, что я испытываю трудности с переполнением.Сэмплирование поведения из-за пределов сети
Например, натрий можно было легко получить текущее значение поведения:
retrieve :: Behaviour a -> IO a
retrieve b = sync $ sample b
Я не вижу, как это сделать в реакционно-банане
(причиной я хочу это потому, что я пытаюсь экспортировать поведение как свойство Dbus свойства могут быть запрошены от других клиентов Dbus)
Edit:. Заменил слово «опрос», как это вводит в заблуждение
На концептуальном уровне дискретизации 'Behavior' имеет смысл только в контексте' Moment', то есть в конкретной момент времени, который 'IO' не предоставляет. Это не просто теоретическая проблема, но важна для внутренней согласованности реализации, поэтому я не решаюсь добавить такую функцию. Не могли бы вы рассказать о конкретном контексте, в котором вы хотите использовать это (dbus)? Скорее всего, это можно выразить по-другому. –
Я устанавливаю функцию обратного вызова (getCurrentState :: IO Response) при создании свойства, которое вызывается при получении запроса. Указанная функция обратного вызова должна каким-то образом восстановить текущее значение Поведения (предположительно используя то же понятие «текущий» или «сейчас» как запуск события, вызвав функцию обработчика, созданную newAddHandler). – Philonous
Оказывается, я могу повторно реализовать такое же поведение с инструментами реактивного банана: [gist] (https://gist.github.com/b334c81018628fd6cfc8).Я использую unsafePerformIO в этом примере, чтобы как можно ближе подойти к семантике натрия, но это отнюдь не обязательно (мне просто нужно было бы выполнить действие IO). Поэтому возникает вопрос: есть ли причина не строить сеть с повторными «выполнением», а не напрямую с компиляцией? – Philonous