
kana
12.12.2017
00:04:33
не совсем контейнер
возьем m = ((->) Int)
(Int -> a) -> (a -> (Int -> b)) -> (Int -> b)
просто когда у нас такая сигнатура - это chain
лучше не придумывать никакие аналогии

Maxim
12.12.2017
00:09:19
Chain из fantasy-land

Google

Maxim
12.12.2017
00:09:30
Имеют ввиду значит

kana
12.12.2017
00:10:14
да

Anton
12.12.2017
00:10:29

kana
12.12.2017
00:10:36
*там 10.toString
хоть конечно стрелку тоже можно как контейнер представить

Maxim
12.12.2017
00:13:39
Спасибо, так очень доходчиво )

kana
12.12.2017
00:14:11
че, действительно? Я полгода назад не понимал этой херни
тут народ крутил эти чейны и мапы над функциями и я такой "че бля"

Maxim
12.12.2017
00:15:05
Ну в процессе

kana
12.12.2017
00:15:12
и я сейчас те же "че бля" издаю, когда аппликативы над функциями применяют
λ> (\n -> (n - 1) + (\x -> x * (x - 1)) (n - 1)) 10
81
λ> (\n -> (n - 1) + (\x -> x * (x - 1)) (n - 1)) 4
9
λ> (\n -> (n - 1) + (\x -> x * (x - 1)) (n - 1)) 3
4
λ> (\n -> (n - 1) + (\x -> x * (x - 1)) (n - 1)) 2
1
/me переписал лямбду из кода выше бесточечно, но решил не постить сюда результат, ибо правила

Google

kana
12.12.2017
00:16:11
правила нужны для того, чтобы их нарушать
liftA2 (+) id (liftA2 (*) id pred) . pred
((+) <*> ((*) <*> pred)) . pred
liftA2 id == <*>
> (+) <$> pred <*> (((*) <*> pred) . pred) $ 10
81

Kelin
12.12.2017
00:18:57
Ну, разница в чем

kana
12.12.2017
00:19:36
~> так обычно обозначают тип контекста (в fantasy land например)
a ~> b -> c
это
a.f(b) :: c
a :: a
b :: b
f :: a ~> b -> c

Maxim
12.12.2017
00:22:48
Вот из-за него в тс юзаю классы
Приходится выражать толпой дженериков


kana
12.12.2017
00:24:10
-> - ну просто стрелка, лямбда
=> - указание ограничений на типы
напримеер, имеем
a -> a
это то же самое, что и
forall a. a -> a
то есть функция работает для любого типа a
а если мы хотим, чтобы она работала только над числами, мы ограничиваем a до Num, Num можно расматривать сейчас как множество всех типов, которые числовые
Num a => a -> a
а если мы хотим, чтобы функция принимала все числа, КОТОРЫЕ МОЖНО СРАВНИВАТЬ, то используем Ord, который содержит ВСЕ типы, значения которых можно сранивнивать замкнуто
(Ord a, Num a) => a -> a
то есть это как мы взяли множест Ord и пересекли с множестом Num и a - это любой тип из пересечения этих множеств
(Ord a, Num a) => a -> a
читается как
для каждого типа a, для которого реализован инстанс класса Ord (т.е. значение типа можно сравнить с другим значением типа) И инстанс класса Num (т.е. можем складывать, вычитать, прочее) имеем сигнатуру функции, которая принимает a и отдает a


Maxim
12.12.2017
00:27:41
Чейн получается всегда бинарная функция? С тремя аргументами какая-то дичь

kana
12.12.2017
00:28:20
да, всегда бинарная. Принимает значение m a и функцию a -> m b
ну по спеке fantasy land это унарный метод
так как m a - ресивер

Maxim
12.12.2017
00:30:06
Ясно, третий аргумент позволили поставить как значение
Ну всё, пора переписать пару редьюсеров на чейн)

Котяй Негодяй
12.12.2017
00:43:30

Maxim
12.12.2017
01:17:27
Посмотрел на тайпинги чейн Рамды в тс и флоу - ерунда всякая

Google

Maxim
12.12.2017
01:19:36
Сбивает с толку, раньше не мог понять чейн

Дмитрий
12.12.2017
01:34:08
В flow кстати в ближайшее время скорее всего будут полноценно выражаемые тайпклассы, к решению вплотную приблизился gcanti, я и ещё пара человек, у кого-то полюбому должно выйти)

Maxim
12.12.2017
01:38:40
Без поддержки массовых иде
Флоу - зомби)

Дмитрий
12.12.2017
01:38:53
С поддержкой

Maxim
12.12.2017
01:39:26
Да нет там ничего, опять на выходных парился

Дмитрий
12.12.2017
01:39:28
Я принципиально в первую очередь проверяю на выводимость типов в реальных условиях

Maxim
12.12.2017
01:40:03
А атом в винде так и не работает стабильно

Дмитрий
12.12.2017
01:40:21
Я уже даже описал все типы и тайпклассы fantasy-land
Осталась последняя проблема с диким сабтайпингом дженерик-функций, мешающая Apply — остальное уже всё работает

Maxim
12.12.2017
01:41:20

Дмитрий
12.12.2017
01:41:56
Я там уже контрибьютор))
Я сейчас просто про полноценную реализацию тайп классов, хотя бы до уровня монадических трансформеров
Идея в том, что с вычурными типами можно описывать сами констрейны, а имплементации просто должны чекнуть что они подходят под ограничения, а юзеру можно предоставлять гораздо более простые и хорошо иллюстрируемые типы

Maxim
12.12.2017
01:45:07

Дмитрий
12.12.2017
01:45:17
Сам флоу

Maxim
12.12.2017
01:45:59
=)
Как там с guard тайпами сейчас?
И в редакторе подсветку ошибок
Вменяемую

Google

Maxim
12.12.2017
01:55:53
https://github.com/flowtype/flow-typed/blob/master/definitions/npm/redux-saga_v0.16.x/flow_v0.56.0-/test_redux-saga_0.16.x.js
Забавно, в тс я провожу тесты тс типов средствами компилятора
Тут пока похуже дела

Дмитрий
12.12.2017
01:56:53

kana
12.12.2017
01:57:33
вечно кажется, что флоу напичкан кучей костылей типа все эти $-типы

Дмитрий
12.12.2017
01:58:14

kana
12.12.2017
01:58:18
с детства недовение ко всему, где есть $

Admin
ERROR: S client not available

Дмитрий
12.12.2017
01:59:34
Ну сначала это предполагалось как внутренние типы, потом решили что семантика вполне очевидная и можно оставлять их в таком виде, заодно не загрязняя неймспейс юзера
Вместе с json выводом компилятора

Maxim
12.12.2017
02:02:45

Дмитрий
12.12.2017
02:04:35
Это не заморочки, лол
https://flow.org/en/docs/lang/refinements/
Если это для тебя сложно то я даже не знаю)

Maxim
12.12.2017
02:05:12
С - сарказм

Дмитрий
12.12.2017
02:06:10
Просто это наоборот форсит использование простейших языковых конструкций вместо заморочек с типами и кастов через any

Maxim
12.12.2017
02:06:15
Тайпгарды, намного веселее рефайнментов

Alice
12.12.2017
02:07:40
Без поддержки массовых иде
Флоу поддерживается любыми иде, поддерживающими эслинт же. У меня лично даже в идее отключены инспекции, связанные с флоу, оставлен только эслинт + еслинт-плюгин-флоутайп-еррорс.

Maxim
12.12.2017
02:07:52
Рефайнмент как по ссылке у тебя, есть с нулевых версий тс

Google

Maxim
12.12.2017
02:09:36

Дмитрий
12.12.2017
02:10:30
вечно кажется, что флоу напичкан кучей костылей типа все эти $-типы
На самом деле жаль до этого раньше не додумались
Это то, как вводят в язык тайплевел конструкции
Нативный, бесконечный $Compose, который физически невозможно написать самому, $Call, предоставляющий результаты вызова функции с произвольным набором аргументов, $TupleMap который на тайплевеле применяет функцию к таплу произвольной длины и содержания, короч это реально нормальная идея, в текущих условиях ты ни одну из вышеперечисленных функций не выразишь в типе самостоятельно

Maxim
12.12.2017
02:11:14

Дмитрий
12.12.2017
02:11:45

kana
12.12.2017
02:12:18
тоже испытывал, ни о каком языком сервере речи не было, он запускал flow по сейфу (автоматическому) и даже на мощном компе все постоянно подвисало

Дмитрий
12.12.2017
02:12:50
У меня в данный момент на ноуте открыто 4 проекта с четырьмя серверами флоу
В одном из них, для понимания масштаба, более трёх тысяч ошибок
У тайпскрипта тупо нет подходящих возможностей чисто технически, чтобы сделать из обычного тайп каста полноценно работающую систему, это всё просто рушится при попытке соединить всё вместе

Maxim
12.12.2017
02:15:44
В каких случаях тс не вывезет рефайнмент юнион типа

Дмитрий
12.12.2017
02:22:27
Вся страница целиком, в каждой точке, выводится на основании единственного типа в самом низу страницы
Выводится причём для обеих веток, так как это Either<A, B>, и в конце я получаю доказательство того что все кейсы учтены,, так как я последовательно урезал B тип до полного empty
То есть в первую очередь это об удобстве разработки речь, мне просто нужно писать заметно меньше чтобы получить гораздо больше

Maxim
12.12.2017
02:26:49
Хм, а если chain. Будет вызываться в другом месте?
С другим типом, совпадающим по ключам

Дмитрий
12.12.2017
02:27:42
Не принципиально, более того, этот файл используется по всему проекту и в хвост и в гриву
Флоу различает номинальную и структурную типизацию и умеет работать с обеими, этот тип ни с чем не пересечется

Maxim
12.12.2017
02:29:41
Не правильно вопрос задал