@frp_ru

Страница 216 из 420
Даниил
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
Даниил
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>). Вот все такие * -> * могут быть монадами

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
естественные изменения монад исходят из внутреннего принципа, так как внешняя причина не может иметь влияния внутри монады

? animufag ?
15.10.2017
13:57:44
что

звучит обидно

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
всё равно не мешает мне сеять шум

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
а корректно думать что either позволяет нам переключаться между двумя мирами?
вообще можно сделать два инстанса для either и тип вычисления над одними и теми же данными в разных контекстах

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

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

Даниил
15.10.2017
14:04:15
Только придется забросить, если кто-нибудь не поддержит ( @KolesnichenkoDS мб)
да-да, надо линейку наконец перепилить и продолжить, + я наверн по алгебре шо-нибудь туда буду писать, я ж в НМУ теперь хожу и Chapter 0 читаю параллельно просто я тут на фронтенд ща отвлёкся (привет, @xgrommx), поэтому не пилил ничего долго

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

illiatshurotshka❄️
15.10.2017
14:04:46
bifunctor?

Даниил
15.10.2017
14:05:44
вообще можно сделать два инстанса для either и тип вычисления над одними и теми же данными в разных контекстах
Не совсем понял, ты имеешь ввиду что-то типа один инстанс чейнит Right, а другой Left или что?

Примерно так вроде в Scala сделано.

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

Даниил
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категория

Даниил
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


? animufag ?
15.10.2017
14:25:21
Ну результат примения функтора н-ой степни (вектор длины н из функторов) с возможностью мапать элемент i, где 0 < i ≤ n Хз, как это описать нормально
ну то есть вполне реально сделать какую-нибудь обертку чтобы map (+1) (Reorder3 ("", "", 1)) бифункторы мапят каждую ветку

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
а что там ответного?
контрвариантные функции

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