Каков эквивалент Elm's Signal (Conal's Behaviors) в RX? Есть ли у RX такая концепция вообще?

Я смотрел это видео (см. Изображение ниже), и это заставило меня задуматься, совпадает ли сигнал вяза с поведением Конала.

Я думаю, что они одинаковы, но я не уверен на 100%. Они одинаковы?

Вот несколько связанных вопросов:

1) Что такое сигнал вяза (поведение Конала) в RX? Есть ли такая концепция в RX вообще? Возможно ReplaySubject?

2) Как я могу превратить наблюдаемый RX в сигнал (поведение) в RX? В Sodium есть функция удержания для этой цели.

3) Что такое наблюдаемое в RX (наблюдаемое в AFAIK RX соответствует событию Конала) в Вязах? Есть ли такая вещь в вязах?

Спасибо за прочтение.

Вот вопросы, выраженные в таблице:

Снимок из разговора вяза:

2 ответа

Вот частичный ответ:

Автор натрия Стивен Блэкхит пишет:

Elm является примером системы, которая имеет один тип сигнала, который объединяет поток и ячейку.

Источник: https://forums.manning.com/posts/list/35274.page

Примечание о соглашении по именованию Sodium:

Sodium Stream - это событие Conal, а Sodium Cell - поведение Conal.

РЕДАКТИРОВАТЬ:

RX BehaviorSubject = Поведение Конала.

RX Observable = событие Конала.

Я полагаю, что ответ на ваш вопрос выше состоит в том, что потенциально ваши первоначальные предположения неверны. Я считаю, что наблюдаемая последовательность (более) аналогична поведению и сигналу (изменяется в течение непрерывного времени, может быть / является бесконечной, синхронной по умолчанию). Кажется, что Конал указывает на то, что Событие - это определенное состояние в определенный момент времени, "событие", например, "событие, описывающее первое нажатие левой кнопки после времени t0" [*1]

|Rx            |Conal   |ELM   |
|--------------|--------|------|
|T             |Event   | ?    |
|IObservable<T>|Behavior|Signal|

Я полагаю, что Событие в описании Конала является действительной величиной в определенный момент времени. Так что будьте конкретнее, я думаю, что это еще точнее

|Rx                         |Conal   |ELM   |
|---------------------------|--------|------|
|TimeStamp<T>               |Event   | ?    |
|ReplaySubject<TimeStamp<T>>|Behavior|Signal|

Я считаю, что здесь ReplaySubject<TimeStamp<T>> более близко представляет Поведение, насколько я понимаю (содержит состояние и время, может извлечь значение в определенный момент времени). Однако как ReplaySubject на самом деле не позволяет просто вытащить состояние из момента времени, они не похожи друг на друга. На мой взгляд, EventStore - более близкое совпадение.

Таким образом, чтобы быть ясным, в моем понимании наблюдаемой последовательности (Rx IObservable<T>) и поведение Конала разделяют подобное определение до некоторой степени. Они оба представляют упорядоченную последовательность значений во времени. Однако в Rx это все наблюдаемая последовательность. Помните, что Rx - это просто библиотека, которая позволяет вам запрашивать потоки событий. Есть некоторые функции, которые позволяют вам кэшировать данные (Replay/Buffer) или работать с окнами данных (Window/GroupJoin) и вы даже можете обогащать данные с помощью временных меток (TimeStamp/TimeInterval).

Однако, где Поведение Конала расходится с Наблюдаемыми Последовательностями, это в его особенностях настойчивости и исторических запросов. Насколько я понимаю, поведение Конала в дополнение к функциям Rx также указывает на то, что вы можете выбрать значение последовательности в любой данный момент времени. Например, при наличии ценового тика во время 00:00:01 в размере 1,23 долл. США, а затем еще одного ценового тика во время 00:00:05 в размере 2,34 долл. США потребитель может запросить значение во время 00:00:02 и получить вернуть значение $1,23 (самое последнее значение на данный момент).

time         [t1   ]  [t2]  [t3]  [t4]  [t5   ]
prices   ----[$1.23]--------------------[$2.34]--->

price@t2 -------------[$1.23]|

Rx не предоставляет никакой поддержки для этого, но можно пойти на все, чтобы написать пользовательские операторы для поддержки этого.

//A forced example of querying historical data.
// Be carefull as Replay() uses an unbounded buffer!
var source = Observable.Interval(TimeSpan.FromMilliseconds(250))
        .Timestamp()
        .Replay();
var connection = source.Connect();

var time2 = DateTimeOffset.Now+TimeSpan.FromSeconds(2);
var valueAtTime2 = source.TakeWhile(ts=>ts.Timestamp <= time2)
                         .LastAsync();

valueAtTime2.Dump();    //LinqPad feature to output the result

Системы, которые могут (могли?) Поддерживать этот вид ретроспективных запросов, могут быть такими системами, как CEP (обработка сложных событий) или базы данных в стиле EventStore.

[* 1]. http://conal.net/papers/icfp97/icfp97.pdf

Другие вопросы по тегам