@frp_ru

Страница 395 из 420
kana
15.02.2018
23:33:48
горю от того, что не могу понять, какая же правильная сигнатура у редьюсеров редакса

(S, A) => S или (S | undefined, A) => S с начальным состоянием

таки попробую сделать в виде классов

Дмитрий
15.02.2018
23:35:15
Это прикол контравариантного значения

Google
Дмитрий
15.02.2018
23:39:51
reducer: (state: S, data: A) => S | void При получении стейта его тип должен быть как минимум S, при передаче — как максимум, то есть для того кто отправляет значение в редьюсер ограничения мягче

kana
15.02.2018
23:41:10
хм, может таки наоборот, как изначально было?

редьюсер всегда отдает стейт, но может не принимать, чтобы установить начальное значение

на вход как максимум S, на выход как минимум

Дмитрий
15.02.2018
23:41:58
хм, может таки наоборот, как изначально было?
Было, но у нас из контекста известно, что фактически эта функция отправляет значение себе на вход)

kana
15.02.2018
23:42:42
и в этой сигнатуре она может отдать на вход void (раз выход идет на вход), и при этом не может (так как вход принимает строго S)

Denis
15.02.2018
23:44:26
Maybe S и вот вам и все)

Дмитрий
15.02.2018
23:44:46
Не не, тут как раз та ситуация где maybe не катит, тут о другом вопрос

kana
15.02.2018
23:44:56
для чего мне это нужно - мне не нравится подход redux-act, я давно хочу довести до ума создание редьюсеров через трансдьюсеры

собственно я это уже сделал, но мне не понравилось

kana
15.02.2018
23:46:27
https://gist.github.com/kana-sama/b277e630b145ef9d9adbc03a1cb6cc8c

Denis
15.02.2018
23:46:59
https://github.com/tigercosmos/date2json/blob/master/index.js :D

Google
kana
15.02.2018
23:47:58
https://gist.github.com/kana-sama/b277e630b145ef9d9adbc03a1cb6cc8c
не нравится мне что - эти трансдьюсеры идут сначала в самый низ, а потом вверх, так как только в этом случае у нас гарантированно будет стейт

Дмитрий
15.02.2018
23:48:04
и в этой сигнатуре она может отдать на вход void (раз выход идет на вход), и при этом не может (так как вход принимает строго S)
type Foo = { a: A, b: B } "Как минимум": { a: A, b: B, c: C } — годится, { a: A } — не годится "Как максимум": { a: A } — годится void — тоже годится { a: A, b: B, c: C } — не годится

kana
15.02.2018
23:48:30
да, я понял прекрасно

в редьюсер можно отдавать undefined, я вот к чему

а вернуть undefined он не может

Denis
15.02.2018
23:49:05
ну блин) прочитайте про join patterns и поймете что весь этот редакс фикция и от недостатка ума

kana
15.02.2018
23:49:12
поэтому на вход как максимум стейт (или больше, вход в принципе вообще не ограничен), как минимум андефайнед на выход как минимум стейт

Kelin
15.02.2018
23:50:04
Ох уж этот редакс

Придумали люди себе проблемы ни с чего, а теперь страдают

?

kana
15.02.2018
23:51:31
ну блин) прочитайте про join patterns и поймете что весь этот редакс фикция и от недостатка ума
в редаксе нет ничего кроме свертки стрима экшонов в стрим результатов свертки подстрима, считаешь свертку недостатком ума?

ну вообще да, она примитивна же

Дмитрий
15.02.2018
23:52:22
Как максимум на вход означает, что у нас может быть void на входе и это типа безопасно. Но у нас по определению же на входе не void! То есть при взгляде изнутри редьюсера ситуация ровным счётом противоположная — мы полностью уверены что то, что на входе — соответствует сигнатуре

Denis
15.02.2018
23:52:57
а ты скинь нормальный читаемый материал
https://en.wikipedia.org/wiki/Join-pattern https://baconjs.github.io/api2.html#join-patterns http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html#AndThenWhen https://github.com/xgrommx/most-reactive-flux/blob/master/app/src/utils.js#L8-L17 https://github.com/xgrommx/react-rx-flux/blob/master/src/rx-extensions.js#L37-L49

Google
kana
15.02.2018
23:54:42
так

ты под join patterns понимаешь обычный аппликативный lift?

собственно в редаксе все это есть

для селекторов

Denis
15.02.2018
23:56:32
ты под join patterns понимаешь обычный аппликативный lift?
Join patterns are a generalization of the zip function. While zip synchronizes events from multiple streams pairwse, join patterns allow for implementation of more advanced synchronization patterns

Дмитрий
15.02.2018
23:56:39
редьюсер может ничего не получить на вход и подставить начальное значение
Вот. А теперь следи за руками — допустим, у нас уже есть редьюсер, который берёт на себя эти обязательства (подставить дефлот в аргумент) и обеспечивает нужные по условию гарантии (возвращает по определению корректный тип) Тогда все редьюсеры, которые можно вложить в него, становятся обладателями контракта с кучей прав и отсутствием обязанностей)

Дмитрий
15.02.2018
23:58:15
Он не внешний, он внутренний ?

kana
15.02.2018
23:58:28
это зависит

в моем кейсе он одновременно и такой, и такой)

Дмитрий
15.02.2018
23:58:54
Бивариантность, да ?

kana
15.02.2018
23:59:44
а именно, изначально он внутренний, все редьюсеры СРАЗУ вызывают следующий, пока не дойдем до него, он отдает уже ГАРАНТИРОВАННЫЙ стейт, и мы поднимаемся по стеку обратно наверх, гарантированно имея стейт и отдавая стейт

Дмитрий
16.02.2018
00:00:22
Я к тому, что я могу воспользоваться шансом и вывернуть апи на изнанку, ввиду чего внешний редьюсер скроется внутри кода, а внутренние станут публично доступными фичами

И я кстати был шокирован, насколько недалеко от сюда до join patterns, там буквально ещё несколько таких финтов с выходом за рамки достаточно для эффективной имплементации

Редакс находится в довольно занятном положении — будучи достаточно простым чтобы умещаться в один твит и заслужить хейт зиги, он как-то ловко балансирует на границе за которой начинается реально суровый CS) Причём начинается неожиданно резко)

kana
16.02.2018
00:21:00
мне надоело, что в flow нет универсальной квантификации ок: forall a. a -> a const x: <T>(x: T) => T не ок: type F<T> = (x: T) => T; const x: F<T> - ошибка, откуда взялся T

причем сделать <T>(x: T) в F нельзя, T потом нужно связывать с другими значениями

Дмитрий
16.02.2018
00:22:53
F<T> = T => T Для любого T есть один и только один тип T => T, такой, что F = <T>T => T Существует такая функция, что для любого T

kana
16.02.2018
00:23:26
ну вот я и хочу x: forall T. F<T>, что изоморфно первому

Google
kana
16.02.2018
00:23:30
а в флоу так нельзя

и нужно писать <T>() => F<T>

Дмитрий
16.02.2018
00:23:45
???

?

type Tagged<Tag> = any type Str = Tagged<string> type Num = Tagged<number>

Это вариант через фантомы, можно как то выкрутиться. Но forall конечно по прежнему нет ?

Плюс existential type

andretshurotshka?❄️кде
16.02.2018
00:43:42
опять монады

Roman
16.02.2018
00:45:22
/pidor@SublimeBot

Sublime Bot
16.02.2018
00:45:22
Я нашел пидора дня, но похоже, что он вышел из этого чата (вот пидор!), так что попробуйте еще раз!

Roman
16.02.2018
00:45:27
/pidor@SublimeBot

Sublime Bot
16.02.2018
00:45:27
Сейчас поколдуем...

Военный спутник запущен, коды доступа внутри...

Высокий приоритет мобильному юниту.

Кто бы мог подумать, но пидор дня - ilia

andretshurotshka?❄️кде
16.02.2018
00:45:40
/shipper@shippering_bot

SHIPPERING
16.02.2018
00:45:40
Никто этого не ожидал

Даже подумать никто не мог

Что эти ребята отношаются

Вы посмотрите на них: @justnoxx + @nevmmv = ♥

Google
andretshurotshka?❄️кде
16.02.2018
00:46:03


так не работает

kana
16.02.2018
00:47:49
еще во флоу нельзя делать дефолтные значения для генериков функций

andretshurotshka?❄️кде
16.02.2018
00:47:56
можно же?

kana
16.02.2018
00:48:32
в тс можно, в flow ругается на знак равно



может пора спать

Дмитрий
16.02.2018
00:50:13
Я уже спал на этой неделе

Roman
16.02.2018
00:50:31
Дмитрий
16.02.2018
00:51:30
От пидора дня до applicative join patterns и обратно ?‍♂️

andretshurotshka?❄️кде
16.02.2018
00:51:59
/pidorstats@SublimeBot

Sublime Bot
16.02.2018
00:52:01
Топ-10 пидоров за текущий год: 1. Dmitry_Kovbasa — 2 раз(а) 2. Ilia — 2 раз(а) 3. defaultvoice — 1 раз(а) 4. Adsumus — 1 раз(а) 5. jqueryisamonad — 1 раз(а) 6. kelin2025 — 1 раз(а) 7. goodmind — 1 раз(а) 8. tetris0k — 1 раз(а) 9. vlastachu — 1 раз(а) 10. reeei — 1 раз(а) Всего участников — 20

Denis
16.02.2018
00:52:15
записки психа

обзервабл это правое расширение кана

import Data.Functor.Kan.Ran newtype ConstT r f a = ConstT { runConstT :: f r } newtype ContT' r m a = ContT' { runContT' :: Ran (ConstT r m) (ConstT r m) a } type Observer a = a -> IO () type Observable a = ContT' () IO a makeObservable :: (Observer a -> IO ()) -> Observable a makeObservable f = ContT' $ Ran $ \k -> ConstT (f (runConstT . k)) subscribe :: Observable a -> Observer a -> IO () subscribe r f = runConstT (runRan (runContT' r) (ConstT . f)) obs = makeObservable $ \observer -> do observer 1 observer 2 main :: IO () main = subscribe obs print

andretshurotshka?❄️кде
16.02.2018
00:52:41
а левое?

Denis
16.02.2018
00:52:53
я еще не познал его)

Дмитрий
16.02.2018
00:53:33
ПРАВОЕ РАСШИРЕНИЕ 0/ 0/ 0/ КАНА

andretshurotshka?❄️кде
16.02.2018
00:53:47
кана?

Denis
16.02.2018
00:54:05
Кана

Страница 395 из 420