

Даниил
15.10.2017
13:36:57
@kana_sama привет,объясните пожалуйста почему promise не монада ,можно же было ее сделать монадой и было бы счастье ?
Вообще чтобы понять что к чему советую открыть спеку Fantasy Land (https://github.com/fantasyland/fantasy-land), и сравнить с поведением промисов. Краткий пересказ ниже.
Функтор (Functor) определяется как тип, имеющий метод map :: Functor f => f a ~> (a -> b) -> f b. Иными словами, map превращает функцию a -> b в функцию, принимающую тип a, "запакованный" в некий тип f и возвращающую таким же образом "запакованный" тип b. Например, для функтора Maybe метод map переводит функцию вида Int -> String в функцию, принимающую Maybe Int и возвращающую Maybe String.
Также для функторного map должны выполняться два закона, но это уже смотри в спеке.
Монада (Monad) определяется как тип, имеющий метод chain :: Monad m => m a ~> (a -> m b) -> m b и статический метод of :: Monad m => a -> m a. of - это просто конструктор, "оборачивающий" произвольный тип в какую-то монаду. chain "распаковывает" значение из монады m a и передаёт его в функцию a -> m b. Про законы для chain и of, опять-таки, читай в спеке Fantasy Land.
Так вот, проблема с промисами в том, что then ведёт себя и как map, и как chain. То есть можно передать в then как функцию вида a -> b, так и функцию вида a -> m b. Это не типобезопасно и нарушает принцип single-responsibility.


kana
15.10.2017
13:36:59
Nikita
Да пофиг на самом деле на то, что мап и чеин одинаковы, это можно списать на то, что мы работаем в языке с проведением типов, тут для каждой операции может быть свое уникальное не статически типизируемое поведение, это важно понимать, мы ведь работаем в контексте жс

Nikita
15.10.2017
13:39:45
Спасибо за объяснения ,сам бы до этого очень не скоро дошел

Google

Nikita
15.10.2017
13:40:11
Последнее монада это просто обертка ?
С:

kana
15.10.2017
13:40:14
Тут важно, что назвав промис монадой мы не получаем абсолютно никакого профита: - других монад с такой спекой нет
- асинк/эвэит не работает ни с чем другим

Nikita
15.10.2017
13:40:47

kana
15.10.2017
13:41:09
Не всегда, монадой может быть любой конструктор типа, то есть тип, параметризующий другим типом

Даниил
15.10.2017
13:41:20

Nikita
15.10.2017
13:41:39

Даниил
15.10.2017
13:42:51
Последнее монада это просто обертка ?
Сама по себе монада, в контексте программирования - это просто паттерн. Ну как вот есть паттерны типа "синглтон" там или "адаптер". Монада - тоже паттерн, только лучше формализованный и имеющий под собой теоретическую основу. Соответственно, когда мы говорим, что Maybe - монада, мы имеем в виду что Maybe реализует определённый паттерн (т.е. имеет методы of, chain и т.д. с определёнными сигнатурами и подчиняющиеся определённым законам).

Nikita
15.10.2017
13:43:42
Ладно спасибо ушел читать https://github.com/fantasyland/fantasy-land, приду через неделю

kana
15.10.2017
13:44:04
Нет) У нас есть типы, пусть они *. Они не могут быть монадами. У нас есть типы, которые требуют другой тип. Например, типа Array (допустим) нет, но есть тип Array<Int>, то есть Array это такая тайплевел функция, которая принимает тип (Int) и отдает другой тип (Array<Int>). Вот все такие * -> * могут быть монадами

Nikita
15.10.2017
13:44:57
например

Google

Denis
15.10.2017
13:45:28
смешные вы

andretshurotshka?❄️кде
15.10.2017
13:47:21
лол

kana
15.10.2017
13:47:25
лол

Даниил
15.10.2017
13:47:43
лол
(это флешмоб?)

illiatshurotshka❄️
15.10.2017
13:50:19
лол

? animufag ?
15.10.2017
13:51:20
монады по сути неделимая субстанция
тут говорили что монады спасут мир от нулов
может кто-нибудь пояснить о чём речь?

Даниил
15.10.2017
13:52:35
ну спасут не какие-то абстрактные "монады", а конкретно Maybe (aka Option etc)

? animufag ?
15.10.2017
13:52:57
ну да
даже наверное его функторный инстанс

illiatshurotshka❄️
15.10.2017
13:53:12
Бог представляет собой творческую монаду, обладающую свойством актуального абсолютного мышления. Бог есть первомонада, все другие монады — её излучения

Даниил
15.10.2017
13:53:24
:3

illiatshurotshka❄️
15.10.2017
13:53:53
с алгтд круто заходит

? animufag ?
15.10.2017
13:54:14
важно понимать что каждая сущность представляет из себя в конечном счёте композицию монад
в расте нет нулла
ну понятно что если делать современный язык то нул там точно не нужен

illiatshurotshka❄️
15.10.2017
13:55:02
смотря какой язык

? animufag ?
15.10.2017
13:55:45
ну разве что если он привязан к какой-нибудь платформе. да и то в пурсе же нету (наверное) нулейбл типов

kana
15.10.2017
13:55:56
Монады можно не расценивать как обычные значения, их смысл намного больше.
У тебя есть какой-то обычный мир вычислений, 5 функций подряд, все как обычно, это Identity-мир.
Но мы можем писать код в Maybe-мире, это такой же мир, как и предыдущий, те же 5 функций, ты работаешь с данными как обычно, только каждая из 5 операций может выкинуть тебя из мира, то есть Maybe дает эффект прерывания выполнения кода в этом мире.
Есть either, который то же самое, только позволяет нашему коду вылететь из мира с каким-нибудь сообщением.
Есть promise, который позволяет нам писать обычный код, только каждая из функций может быть ассинхронной, хоть в нашем промис-мире мы этого не видим

Google

kana
15.10.2017
13:55:56
Когда осознаешь, что монады - это такие отдельные миры поверх чистого мира с каким-то эффектом, то перестаешь писать x.isJust() ? X.valus : ...
Поэтому сложно не найти применение мэйби, а "не найти его")
Мэйби сама по себе неплохая идея для описания нуллабл значений в языках с типами, но монадность мэйби поднимает ее на уровень выше

Denis
15.10.2017
13:56:41
смешные вы

? animufag ?
15.10.2017
13:56:50
естественные изменения монад исходят из внутреннего принципа, так как внешняя причина не может иметь влияния внутри монады

andretshurotshka?❄️кде
15.10.2017
13:57:18
смешные вы

? animufag ?
15.10.2017
13:57:44
что
звучит обидно

illiatshurotshka❄️
15.10.2017
13:57:58
Монады можно не расценивать как обычные значения, их смысл намного больше.
У тебя есть какой-то обычный мир вычислений, 5 функций подряд, все как обычно, это Identity-мир.
Но мы можем писать код в Maybe-мире, это такой же мир, как и предыдущий, те же 5 функций, ты работаешь с данными как обычно, только каждая из 5 операций может выкинуть тебя из мира, то есть Maybe дает эффект прерывания выполнения кода в этом мире.
Есть either, который то же самое, только позволяет нашему коду вылететь из мира с каким-нибудь сообщением.
Есть promise, который позволяет нам писать обычный код, только каждая из функций может быть ассинхронной, хоть в нашем промис-мире мы этого не видим
а корректно думать что either позволяет нам переключаться между двумя мирами?

andretshurotshka?❄️кде
15.10.2017
13:58:02
ну вообще норм тема сводить разговоры о монадах к монологу лейбница
вообще если бы здесь потролить то норм отсылаться на лейбница про его монолог

? animufag ?
15.10.2017
13:58:22
ну и что

andretshurotshka?❄️кде
15.10.2017
13:58:24
))
это же оттуда

? animufag ?
15.10.2017
13:58:42
всё равно не мешает мне сеять шум

Даниил
15.10.2017
13:58:43

illiatshurotshka❄️
15.10.2017
13:58:53
аааааааа
type LSD = Either

Kelin
15.10.2017
13:59:58
Иногда смотрю чат и не понимаю, как людям не впадлу такие простыни писать здесь

Google

kana
15.10.2017
14:00:19
Я же целый канал для простыней создал

? animufag ?
15.10.2017
14:00:47

kana
15.10.2017
14:00:49
Только придется забросить, если кто-нибудь не поддержит ( @KolesnichenkoDS мб)

Kelin
15.10.2017
14:00:51
Канал-то понятно)

Даниил
15.10.2017
14:04:15

kana
15.10.2017
14:04:30
Иногда смотрю чат и не понимаю, как людям не впадлу такие простыни писать здесь
Смотри, то, что я выше написал про миры - это моя идея, которая пришла ко мне ~под кайфом~ когда я пару ночей не спал. Идея мне понравилась, поэтому мне сложно с ней не поделиться. То есть для меня было бы наоборот странно, если бы я что-то придумал, но ни с кем этим не поделился, эта идея так бы и умерла бы. Поэтому писать простыни - мое обычное состояние

illiatshurotshka❄️
15.10.2017
14:04:46
bifunctor?

Даниил
15.10.2017
14:05:44
Примерно так вроде в Scala сделано.

kana
15.10.2017
14:05:59
Можно бимонад сделать)

? animufag ?
15.10.2017
14:06:06

Denis
15.10.2017
14:06:40

Даниил
15.10.2017
14:06:56
?
ну ты на JS триггеришься

illiatshurotshka❄️
15.10.2017
14:07:16
а фронт не обязательно на жс писать

Даниил
15.10.2017
14:08:19
ну как бимап?
ну да, я уже понял шо это тупо бифунктор/бимонада/бичётотам

kana
15.10.2017
14:10:08
Плохо, что нельзя n-функторы обобщить

? animufag ?
15.10.2017
14:10:48
да просто так вбросил

Даниил
15.10.2017
14:10:50
а фронт не обязательно на жс писать
Я уже поиспытывал боль от невозможности всё затипизировать даже с Flow из-за отсутствия ADT и тайпклассов и пытаюсь впилить пурсу. Пока не очень получается со сборкой, потому что я хочу шоб логика была на пурсе а компоненты на ES2017 + Flow + JSX. И пока у меня не получается сделать ни шоб вебпак проходился бабелем по FFI-модулям прежде чем их подхватит пурса, ни шоб можно было импортировать PureScript из JS не прописывая полные пути к файлам.

Google

Denis
15.10.2017
14:11:56

? animufag ?
15.10.2017
14:12:10
можно сделать type Left a b = Either b a
и инстансы по левому краю

Даниил
15.10.2017
14:14:22
Кстати, @kana_sama, я ошибся тогда, изменение порядка лоадеров нихуя не помогло, это я просто убрал случайно foreign import.

kana
15.10.2017
14:14:35
опишешь это категорно?
Ну результат примения функтора н-ой степни (вектор длины н из функторов) с возможностью мапать элемент i, где 0 < i ≤ n
Хз, как это описать нормально
Ненене

Denis
15.10.2017
14:15:20
наверное ты понимаешь что функторы это 2категория

? animufag ?
15.10.2017
14:15:21

Даниил
15.10.2017
14:15:31
+ из JS-кода приходится писать шо-то типа
import { reducer } from "./Reducers/Reducer.purs"
шо конечно не смертельно, но раздражает, не знаю есть ли способ сделать норм без переименовывания файлов в index.purs

Denis
15.10.2017
14:15:36
морфизм между 1категорией
и морфизм функтора это нат преобразование

kana
15.10.2017
14:15:59
Ты к тому, чтт в кортеже будут объекты разных категорий?

illiatshurotshka❄️
15.10.2017
14:16:18

Denis
15.10.2017
14:17:07

? animufag ?
15.10.2017
14:25:21

kana
15.10.2017
14:27:09
И бифункторов есть map1 и map2 (я не помню, как они там называются в хачкеле, first/second?), которые мапают только одну ветку. Нужно делать такой зависимый
mapn :
{ts : Vect n Type} ->
(x : Nat) ->
LT x n ->
((ts^.at x) -> b) ->
(f ts -> f (ts&at x.~b))
Хуйня полная конечно

andretshurotshka?❄️кде
15.10.2017
14:38:56
https://twitter.com/typescriptlang/status/918553546647150592
ответочка от ts флоутайпу
норм

Denis
15.10.2017
14:45:25
а что там ответного?

andretshurotshka?❄️кде
15.10.2017
14:45:36