Viacheslav
Artyom
мне нравится альтернативное определение Applicative через <++> :: f a -> f b -> f (a, b), без аппликаторов
если ты рассматриваешь f как какой-то эффект, то получается, что <++> просто выполняет оба эффекта и ничего не делает с самими значениями. Что-то вроде моноида. В некоторых случаях там вообще напрямую моноид проглядывает – ну например Const x a у тебя будет аппликативом, если x моноид, и тогда <++> или <*> эти иксы тупо сложит:
> :t (<*>) @(Const String)
(<*>) @(Const String)
:: Const String (a -> b) -> Const String a -> Const String b
> Const "foo" <*> Const "bar"
Const "foobar"
как понять списки через эффекты или контексты, я без понятия (у меня никогда не получалось нормально), поэтому я просто запомнил, что со списками обычно можно твердить про себя “декартово произведение, декартово произведение” и вроде обычно работает. Есть ещё много штуковин, которые через эффекты мне сложно понять, и там приходится тоже запоминать, что будет делать Applicative/Monad
Aleksei (astynax)
Эффект, кстати, вполне норм, потому что это нечто, что происходит "вокруг" вызова чистой функции - состояние, недетерминированность, возможность не получить результат или получить ошибку. И вот такие функции, которые не "просто возвращают результат", в хаскеле имеют "непростой" тип. Но ведь в ФП нам хочется композировать любые функции и вот как раз монады и аппликативы позволяют композить непростые - по-разному непростые - функции единообразно
Viacheslav
Чтобы понять про аппликатив можно почитать пейпер
Viacheslav
http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf
Aleksei (astynax)
В "книжке со слоном" вполне понятно вводятся последовательно Ф, АФ и затем М
Зигохистоморфный
Aleksei (astynax)
монада не "управляет" эффектом, она просто его "сохраняет"
Зигохистоморфный
не, эффектом управляет программист, что пишет эти стрелки Клейсли
Aleksei (astynax)
ага
Aleksei (astynax)
Бартош в каком-то из подкастиков типа Functional Geekery неплохо про монады рассказывал "для новичков"
Зигохистоморфный
ну у него есть курс по хаскелл и 2 части по ТК
Aleksei (astynax)
https://www.functionalgeekery.com/episode-69-bartosz-milewski/ вот этот выпуск
Aleksei (astynax)
Зигохистоморфный
ага) со свинками и слониками
Max
В книжке со слоником перед монадой шел моноид, емнип. Как вычисления со стартовой точкой.
Зигохистоморфный
лучше расскажите про профунктор) и все эти звезды, козведы, клоуны и все такое
кана
Ну профунктор имхо как-то намного проще понять, чем аппликатор (понять смысл)
Anonymous
а так ли важно именно понять? понимание это обманчивая штука. некоторые люди считают, что поняли монады, а потом говорят что монады это про сайдэффекты или что монады это обработка ошибок в джаваскриптовых промисах
Anonymous
я думаю, надо принципиально отказаться от этой парадигмы "понимания", ведь в конечном счёте важно просто научиться пользоваться
кана
Как использовать паттерн, если не понимаешь, что он такое
кана
Обычно же до паттернов доходишь сам, а потом узнаешь, что он уже формализован
Anonymous
да можно и не понимать, обычно из type signature всё понятно
Anonymous
типы помогут
Anonymous
паттерны это гавно из ооп
кана
Вот я не представляю, когда мне нужно начать оборачивать свои типы в некие другие типы, чтобы можно было применять к ним аргументы из этого же типа
Anonymous
нам не нужны паттерны, нам нужны бест практисы
кана
Паттерн это шаблон
кана
Независимо от тогг, где он
Anonymous
монада это паттерн?
кана
Тайпкласс и паттерн почти одно и то же
кана
Да
Anonymous
ну-ну
Anonymous
ок)
кана
Любой тип, который имеет шабонные (общие) функции ретурн и бинд - монада
кана
Так почему это не паттерн
Anonymous
ну ок, но зачем на это смотреть как на паттерн?
кана
Тут пример использования слова без его понимания (за что ты топишь). Слово паттерн не привязано не то, что к ооп, но и к программированию в целом
Anonymous
я тут как бы за превосходство интуиции над пониманием.
Anonymous
паттерны это тоже больше про интуицию, а не про понимание
кана
А как смотрят на паттерн?) Я меня нет какого-то особого взгляда на шаблоны, это просто нейкий способ вынести в абстракцию (тайпкласс) общие принципы
Anonymous
если интуиция не правильная, то скорее всего сработает тайпчекер и ты получишь ошибку
Anonymous
кана
Сложный вопрос) Понимание же всегда в приоритете, нет?
Anonymous
Блин вообще извините, я выпил и не понимаю о чем говорю
кана
Да, я тоже
Anonymous
Всему виной вот эти заигрывания с интуицией
Anonymous
Я ещё книжку по интуиционистской логике сейчас читаю, хоть это и не про то немного
Vasiliy
нахрен интуицию, даёшь практику
кана
Мысль, которая крутится в моей голове - аппликаторы - не самостоятельный класс, а некое расширение/дополнение других типов, в которых есть возможность хранить внутри функцию
кана
Например функторв
Vasiliy
просто пишешь код, а потом раз - вроде понял, в чём суть
кана
Потому что зачем оборачивать функцию в пьюр просто так я не понимаю.
кана
Да, такой подход обычно помогает
кана
Но вот я поработал с парсеком, использовал аппликаторы часто
кана
И не пришло понимание
Vasiliy
Vasiliy
смари, есть у тебя ф-ция от двух аргументов: add :: Int -> Int -> Int
Anonymous
кана
Ну вот я и говорю, что мол апплмкаторы для того, чтобы работать с уже обернутыми функциями, а не шоб оборачивать и работать
Vasiliy
и есть пара вычислений, которые вычисляют числа какие-то, но могут и не вычислить
Vasiliy
a :: Maybe Int и b :: Maybe Int
кана
Мол функция обернута, хреново, но ниче, тип реализует аппликатор и все збс
кана
Ага
Зигохистоморфный
Vasiliy
и тебе надо в случае успеха всё сложить
кана
Ну реализация через бинды мне кажется более естественной
Vasiliy
ну тут и получается add <$> a <*> b
кана
Особенно через do
Vasiliy
do - это синтаксис
Anonymous
сахарок причём
кана
Ну я не к тому. Я к тому, что выразить через бинды естественнее имхо, а с do это еще и выглядит не страшно
кана
https://gist.github.com/kana-sama/387cf858097ed46610eca280229966fe
кана
Вот тут много такой хернм
кана
Там бы liftA4 зашел, но его нет)
доня.
ахах, типичная дискуссия хаскеллистов
доня.
Блин вообще извините, я выпил и не понимаю о чем говорю