Каков эквивалент 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.