Denis
23.09.2017
18:22:20
выходит что uppercase надо для B {a: String, b: String} всех?
illiatshurotshka❄️
23.09.2017
18:22:44
capitalise*
да
Denis
23.09.2017
18:23:12
ну тогда можно вроде через вертикальную композицию линз
Google
illiatshurotshka❄️
23.09.2017
18:23:55
что за вертикальная композиция
Дмитрий
23.09.2017
18:24:00
https://pursuit.purescript.org/packages/purescript-redox/7.0.1
Посмотри как тут сделано, там экшны-тайпы — это символы, так что подозреваю, что отдельные обработчики создавать не нужно (я не делаю этого даже в жс)
illiatshurotshka❄️
23.09.2017
18:24:11
в monocle не видно
kana
23.09.2017
18:24:59
оо, тянуть фри-монады всякие ради примитивных редьюсеров я не хочу)
Дмитрий
23.09.2017
18:27:57
Ну и я скорее не про фри монады а про сами экшны
andretshurotshka?❄️кде
23.09.2017
18:42:45
Denis
23.09.2017
18:47:21
{-# LANGUAGE DataKinds, FlexibleContexts, TemplateHaskell, DuplicateRecordFields #-}
module Main where
import Control.Lens
import Control.Lens.TH
import Data.Char (toUpper)
import Control.Monad
import Control.Applicative
data B = B {_a:: String, _b:: String} deriving Show
data A = A {_a:: B, _b:: B, _c:: B} deriving Show
makeLenses ''A
makeLensesFor [("_a", "a1"), ("_b", "b1")] ''B
x = A (B "Test" "Test2") (B "Test" "Test2") (B "Test" "Test2")
vc2 = liftA2(>=>)
vc3 = liftA3(\x y z -> x >=> y >=> z)
over (vc3 (a . vc2 a1 b1) (b . vc2 a1 b1) (c . vc2 a1 b1)) (map toUpper) x
вот
vc2, vc3 это типа вертикальные композиции для линз
и результат
A {_a = B {_a = "TEST", _b = "TEST2"}, _b = B {_a = "TEST", _b = "TEST2"}, _c = B {_a = "TEST", _b = "TEST2"}}
kana
23.09.2017
18:50:40
вот что получилось
Modules - комбайн редьюсеров (пока только одного)
Google
kana
23.09.2017
18:51:42
нужно думать, как избавиться от начального состояния
и диспатч классный)
illiatshurotshka❄️
23.09.2017
18:52:48
@xgrommx а ты видел https://hackage.haskell.org/package/category-extras-0.53.4/docs/Control-Morphism-Synchro.html ?
Denis
23.09.2017
18:53:20
это уже смесь биалгебр и триалгебр
andretshurotshka?❄️кде
23.09.2017
19:00:30
kana
23.09.2017
19:21:41
illiatshurotshka❄️
23.09.2017
19:21:51
liftA2 (>=>)
:: (Applicative f, Monad m) =>
f (a -> m b) -> f (b -> m c) -> f (a -> m c)
Dmitry
23.09.2017
19:32:10
шо это зачем это ?
kana
23.09.2017
19:32:35
так, попробовал интегрировать пурсу в редакс-проект. Какие подвнодные камни:
1. в пурсе все бинарные и выше функции транслируются во вложенные функции, что логично, но из-за этого нужно каждые редьюсеры оборачивать в uncurryN(2, reducer), uncurryN из рамды
2. нужно писать те же экшон-креаторы для жс-кода, потому что работать без них в жс с конструкторами пурсы сложно
3. редакс в редьюсеры посылает @@redux/INIT, обработать его из пурсы не получится, а без обработки там ошибка будет падать. Поэтому нужно было в тип Actions добавлять лишний Init и потом делать кейс reducer state _ = iniitalState, но даже это работать не будет, смотрите ниже
4. даже от того, что выше, пришлось отказаться, потому что редакс зачем-то требует, чтобы экшоны были объектами (много на себя берет), поэтому пришлось каждый экшон обарачивать в рекорд, а потом матчерить кейсом.
5. дефолтных значений в пурсе делать нельзя, а начальное значение указывать в кейсе _ тоже нельзя, потому что редакс будет посылать сюде все экшоны, даже не наши.
Из-за этого нужно будет писать свой враппер над всеми редьюсерами на пурсе, комбайнить их тоже на пурсе, чтобы и INIT обработать, и type убрать, и экшоны в экшоны оборачивать (чтобы вложенные редьюсеры делать)
Все это делает интеграцию пурсы с редаксом возможной, но код получается так себе, профитов от перевода редьюсеров на пурсу будет не так много, как хотелось бы
или вот норм пост - https://vk.com/feed?w=wall-135720595_700
Kelin
23.09.2017
19:32:57
аце что за красота сверху
а, пурс
kana
23.09.2017
19:34:55
меняем в редьюсере порядок на правый, получаем еще лучше
reducer :: Action -> State -> State
reducer Init = const 0
reducer Increment = (_ + 1)
reducer Decrement = (_ - 1)
reducer (Delta x) = (_ + x)
кстати, в пурсе проблему с каррированным - исправили имхо очень хорошо. Проблему с начальным стейтом тоже решил
Dmitry
23.09.2017
20:13:06
а как оно по перформансу в purescript ?
kana
23.09.2017
20:20:58
скорее всего плохо, так все по дефолту каррированное в js, хоть если использовал rollup-plugin, то нормально должно быть (да и вроде как v8 сам по себе эти места оптимизирует)
Дефолтные массивы - массивы из js, поэтому работа с данными будет не быстрее, чем иммутабельно в js, но люди активно используют всякие линкед списки.
Офигенный интероп, это не элмовские порты
Из книги по пурсе нужно абсолютно точно вырезать реакт и работу с конвасом. Че там забыли эти главы я хз. Возможно это и есть тот "example", но для таких вещей есть документация пакетов
Denis
24.09.2017
09:21:14
так про канвас на фри монадах?
kana
24.09.2017
09:23:48
Нет, во фримонадах там канваса нет, он там сам по себе главой отдельной
Denis
24.09.2017
09:26:49
я про этот пакет https://github.com/paf31/purescript-free-canvas
Google
andretshurotshka?❄️кде
24.09.2017
09:30:00
kana
24.09.2017
09:36:42
https://github.com/slamdata/purescript-halogen/tree/master/docs
Denis
24.09.2017
09:38:00
andretshurotshka?❄️кде
24.09.2017
09:53:23
хорошо хоть где-то тесты есть
https://a-guide-to-the-purescript-numeric-hierarchy.readthedocs.io/en/latest/
Denis
24.09.2017
10:12:15
большинство пакетов пурсы это подлые попты с хаскелль
andretshurotshka?❄️кде
24.09.2017
10:12:53
подлые?)
доку почему тогда не портируют)
или там ее тоже нет?(
кто смог разобраться в новых типах рамды для тс?)
Denis
24.09.2017
10:24:54
чо?
andretshurotshka?❄️кде
24.09.2017
10:25:04
ну там хрень полная
https://github.com/types/npm-ramda/issues/196
ради типизации R.__ сделали костыль с генериками
Note that the new placeholder support requires explicitly describing the positions with placeholders using a bit-mask generic on a 0-param function call, e.g. R.adjust(R.__, 3)<"01">(), where 0 represents the placeholder position,1 represents an actual value (in this case 3).
illiatshurotshka❄️
24.09.2017
10:26:56
andretshurotshka?❄️кде
24.09.2017
10:27:14
illiatshurotshka❄️
24.09.2017
10:27:26
сед
а че линзы в хаскеле нельзя без TH использовать? в скале как-то покрасивее
Google
kana
24.09.2017
10:37:34
Можно же, просто нужно много бойлерплейта писать на каждое поле
Denis
24.09.2017
10:42:19
а чем TH плох? хоть болерплейт писать не надо
у тебя что xiaomi?
kana
24.09.2017
10:43:18
Ну, note 4x
Denis
24.09.2017
10:43:43
просто узнал miui
illiatshurotshka❄️
24.09.2017
10:44:07
а стоп
в скале тоже макрокоманды используются
Denis
24.09.2017
10:45:21
в скале красивее чем в haskell?)) особенно типы)
andretshurotshka?❄️кде
24.09.2017
10:45:32
[[[[[[
kana
24.09.2017
10:46:49
Мне это в скале не нравится, в хаскеле-подобных сразу видна аналогия на тайп-левел функции, Maybe : Type -> Type
Denis
24.09.2017
10:48:18
тем более если хочешь сам линзочки именовать то есть makeLensesFor
kana
24.09.2017
10:50:19
Вот бы завезли в хаскель нормальные рекорды, а то проблемы рекордов переносятся и на линзы, еще и префикс _ нужно делать
Denis
24.09.2017
10:51:09
не обязательно)
kana
24.09.2017
10:51:43
Ну это настраивается, но по стандарту нужно, чтобы стиль не отличался
Дефолт - важный фактор, с которым нужно считаться
Denis
24.09.2017
10:54:05
data Boo = Boo {xx :: String, yy :: String}
makeLensesFor [("xx", "_xx"), ("yy", "_yy")] ''Boo
view _xx $ Boo { xx = "Test", yy = "Test2" }
illiatshurotshka❄️
24.09.2017
10:56:27
что значит ''?
Denis
24.09.2017
10:57:52
ну такой синтаксис у TH
Дмитрий
24.09.2017
12:28:28
"Ну прост"
Kelin
24.09.2017
12:29:22
Гомеопати
Google
Kelin
24.09.2017
12:29:43
как символично, у меня маман заболела и пьет оциллококцинум
illiatshurotshka❄️
24.09.2017
12:30:23
какую либу стоит использовать для оптики в js/flow?
Дмитрий
24.09.2017
12:34:50
Свою
Мне ничто не нравится
illiatshurotshka❄️
24.09.2017
12:39:06
а твоя публичная?
Kelin
24.09.2017
12:47:47
?
andretshurotshka?❄️кде
24.09.2017
12:54:41
illiatshurotshka❄️
24.09.2017
12:55:05
а где там оптика
andretshurotshka?❄️кде
24.09.2017
12:55:15
а
нигде)
Дмитрий
24.09.2017
12:56:19
Угу
По крайней мере нормально типизированного
illiatshurotshka❄️
24.09.2017
12:57:06
я понял, но это подразумевает что у тебя что-то уже есть))
Дмитрий
24.09.2017
12:58:29
Для оптики нужны сначала Either, Maybe и Tuple, я их только недавно и сделал
Kelin
24.09.2017
15:41:07
illiatshurotshka❄️
24.09.2017
15:41:23
о adt?
andretshurotshka?❄️кде
24.09.2017
15:45:11
если в жс то статьи про fantasy land
illiatshurotshka❄️
24.09.2017
15:45:35
желательно изучить их в языке с нормальными ADT
а потом посмотреть на то как это переносят в js