@haskellru

Страница 330 из 1551
Vasiliy
20.07.2017
20:22:47
мне стало более понятно, когда я про free почитал

kana
20.07.2017
20:23:08
Объясни пожалуйста

Vasiliy
20.07.2017
20:23:24
ну вот Identity, например... :D

Google
kana
20.07.2017
20:23:31
Возможно, сегодня будет тот самый день, когда мою голову пошатнет понимание

Denis
20.07.2017
20:25:17
Возможно, сегодня будет тот самый день, когда мою голову пошатнет понимание
когда ты используешь аппликатив, то ты всегда уверен что сработает тот эффект который заложен в контейнерном типе (а в монадках ты управляешь этим) не всегда нужна монада, вот например для парсера аппликатив очень даже ок

Aleksey
20.07.2017
20:33:43
почему все всегда скатывается к "контейнеру типу"? нет никакого контейнера в общем случае

Artyom
20.07.2017
20:35:51
мне нравится альтернативное определение 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

Aleksey
20.07.2017
20:40:29
Эффект, кстати, вполне норм, потому что это нечто, что происходит "вокруг" вызова чистой функции - состояние, недетерминированность, возможность не получить результат или получить ошибку. И вот такие функции, которые не "просто возвращают результат", в хаскеле имеют "непростой" тип. Но ведь в ФП нам хочется композировать любые функции и вот как раз монады и аппликативы позволяют композить непростые - по-разному непростые - функции единообразно

Vyacheslav
20.07.2017
20:40:35
Чтобы понять про аппликатив можно почитать пейпер

http://www.staff.city.ac.uk/~ross/papers/Applicative.pdf

Aleksey
20.07.2017
20:42:02
В "книжке со слоном" вполне понятно вводятся последовательно Ф, АФ и затем М

Aleksey
20.07.2017
20:43:56
монада не "управляет" эффектом, она просто его "сохраняет"

Denis
20.07.2017
20:44:32
не, эффектом управляет программист, что пишет эти стрелки Клейсли

Google
Aleksey
20.07.2017
20:44:47
ага

Бартош в каком-то из подкастиков типа Functional Geekery неплохо про монады рассказывал "для новичков"

Denis
20.07.2017
20:48:55
ну у него есть курс по хаскелл и 2 части по ТК

Aleksey
20.07.2017
20:49:18
https://www.functionalgeekery.com/episode-69-bartosz-milewski/ вот этот выпуск

ну у него есть курс по хаскелл и 2 части по ТК
ещё есть серия статей с клевыми рисунками :)

Denis
20.07.2017
20:50:22
ага) со свинками и слониками

Max
20.07.2017
20:52:25
В книжке со слоником перед монадой шел моноид, емнип. Как вычисления со стартовой точкой.

Denis
20.07.2017
20:53:14
лучше расскажите про профунктор) и все эти звезды, козведы, клоуны и все такое

kana
20.07.2017
21:40:36
Ну профунктор имхо как-то намного проще понять, чем аппликатор (понять смысл)

Vladimir
20.07.2017
21:45:34
а так ли важно именно понять? понимание это обманчивая штука. некоторые люди считают, что поняли монады, а потом говорят что монады это про сайдэффекты или что монады это обработка ошибок в джаваскриптовых промисах

я думаю, надо принципиально отказаться от этой парадигмы "понимания", ведь в конечном счёте важно просто научиться пользоваться

kana
20.07.2017
21:47:17
Как использовать паттерн, если не понимаешь, что он такое

Обычно же до паттернов доходишь сам, а потом узнаешь, что он уже формализован

Vladimir
20.07.2017
21:48:05
да можно и не понимать, обычно из type signature всё понятно

типы помогут

паттерны это гавно из ооп

kana
20.07.2017
21:48:42
Вот я не представляю, когда мне нужно начать оборачивать свои типы в некие другие типы, чтобы можно было применять к ним аргументы из этого же типа

Vladimir
20.07.2017
21:48:46
нам не нужны паттерны, нам нужны бест практисы

kana
20.07.2017
21:48:51
Паттерн это шаблон

Независимо от тогг, где он

Google
Vladimir
20.07.2017
21:49:19
монада это паттерн?

kana
20.07.2017
21:49:21
Тайпкласс и паттерн почти одно и то же

Да

Vladimir
20.07.2017
21:49:25
ну-ну

ок)

kana
20.07.2017
21:49:57
Любой тип, который имеет шабонные (общие) функции ретурн и бинд - монада

Так почему это не паттерн

Vladimir
20.07.2017
21:50:55
ну ок, но зачем на это смотреть как на паттерн?

kana
20.07.2017
21:50:55
Тут пример использования слова без его понимания (за что ты топишь). Слово паттерн не привязано не то, что к ооп, но и к программированию в целом

Vladimir
20.07.2017
21:52:33
я тут как бы за превосходство интуиции над пониманием.

паттерны это тоже больше про интуицию, а не про понимание

kana
20.07.2017
21:53:03
А как смотрят на паттерн?) Я меня нет какого-то особого взгляда на шаблоны, это просто нейкий способ вынести в абстракцию (тайпкласс) общие принципы

Vladimir
20.07.2017
21:53:33
если интуиция не правильная, то скорее всего сработает тайпчекер и ты получишь ошибку

kana
20.07.2017
21:55:17
Сложный вопрос) Понимание же всегда в приоритете, нет?

Vladimir
20.07.2017
21:56:24
Сложный вопрос) Понимание же всегда в приоритете, нет?
Так вот мой поинт в том, что если это так, то это надо исправить.

Блин вообще извините, я выпил и не понимаю о чем говорю

kana
20.07.2017
21:57:18
Да, я тоже

Vladimir
20.07.2017
21:57:27
Всему виной вот эти заигрывания с интуицией

Я ещё книжку по интуиционистской логике сейчас читаю, хоть это и не про то немного

Google
Vasiliy
20.07.2017
21:59:09
нахрен интуицию, даёшь практику

kana
20.07.2017
21:59:31
Мысль, которая крутится в моей голове - аппликаторы - не самостоятельный класс, а некое расширение/дополнение других типов, в которых есть возможность хранить внутри функцию

Например функторв

Vasiliy
20.07.2017
21:59:43
просто пишешь код, а потом раз - вроде понял, в чём суть

kana
20.07.2017
22:00:14
Потому что зачем оборачивать функцию в пьюр просто так я не понимаю.

Да, такой подход обычно помогает

Vladimir
20.07.2017
22:00:27
просто пишешь код, а потом раз - вроде понял, в чём суть
вот это "вроде понял" и есть интуиция. ключевое слово "вроде".

kana
20.07.2017
22:00:48
Но вот я поработал с парсеком, использовал аппликаторы часто

Vladimir
20.07.2017
22:01:19
Но вот я поработал с парсеком, использовал аппликаторы часто
работа с парсеком и схожими либами прокачивает эту интуицию неплохо

kana
20.07.2017
22:01:25
И не пришло понимание

Admin
ERROR: S client not available

Vasiliy
20.07.2017
22:01:40
смари, есть у тебя ф-ция от двух аргументов: add :: Int -> Int -> Int

Vladimir
20.07.2017
22:02:21
И не пришло понимание
как что-то плохое

kana
20.07.2017
22:02:28
Ну вот я и говорю, что мол апплмкаторы для того, чтобы работать с уже обернутыми функциями, а не шоб оборачивать и работать

Vasiliy
20.07.2017
22:02:57
и есть пара вычислений, которые вычисляют числа какие-то, но могут и не вычислить

a :: Maybe Int и b :: Maybe Int

kana
20.07.2017
22:03:10
Мол функция обернута, хреново, но ниче, тип реализует аппликатор и все збс

Ага

Denis
20.07.2017
22:03:35
Ага
яркий пример liftA2

Google
Vasiliy
20.07.2017
22:03:52
и тебе надо в случае успеха всё сложить

kana
20.07.2017
22:04:06
Ну реализация через бинды мне кажется более естественной

Vasiliy
20.07.2017
22:04:10
ну тут и получается add <$> a <*> b

kana
20.07.2017
22:04:11
Особенно через do

Vasiliy
20.07.2017
22:04:28
do - это синтаксис

Vladimir
20.07.2017
22:04:43
сахарок причём

kana
20.07.2017
22:06:07
Ну я не к тому. Я к тому, что выразить через бинды естественнее имхо, а с do это еще и выглядит не страшно

https://gist.github.com/kana-sama/387cf858097ed46610eca280229966fe

Вот тут много такой хернм

Там бы liftA4 зашел, но его нет)

Даниил
20.07.2017
22:07:32
ахах, типичная дискуссия хаскеллистов

Блин вообще извините, я выпил и не понимаю о чем говорю

Да, я тоже

Aleksey
21.07.2017
04:35:26
Аппликатив для того и нужен, чтобы не делать все эти liftAN

Отдельные лифты с небольшим N остаются только потому, что они работают быстрее (минус одно заворачивание и разворачивание)

kir
21.07.2017
04:56:30
Аппликатив - это урезанная монада. В отличие от монады, где ты вешаешь коллбэки на контейнер,и последующие вычисления зависят от предыдущих - к аппликативу ты не можешь прикрепить коллбэк, ты можешь только склеить два контейнера. Зато эти два контейнера могут разрешаться результатом любом порядке. Итак: аппликатив - дерево вычислений (зависимостей?), монада - последовательность вычислений. Так я это вижу.

Leonid
21.07.2017
05:16:39
($) :: (a -> b) -> a -> b (<$>) :: Functor f => (a -> b) -> f a -> f b (<*>) :: Applicative f => f (a -> b) -> f a -> f b Краткая суть

Aleksey
21.07.2017
05:38:17
Не надо забивать неокрепшим умам голову контейнерами и колбэками! Ничего этого нет! Именно из-за плохих аналогий такой отстой с монадными туториалами

Монада просто позволяет делать композицию типов определенного вида, аппликатив позволяет применять функции определенного вида. При этом "определённый вид", это просто ещё одна переменная в типе. Всё

Что уж там конечный программист положит в переменную типа - это его дело. Дело монады дать законы, соблюдая которые, программист получит нормальную композицию

И тем монада и отличается от сферического паттерна, что имеет законы.

Без законов был бы просто интерфейс для навешивания коллбэков

($) :: (a -> b) -> a -> b (<$>) :: Functor f => (a -> b) -> f a -> f b (<*>) :: Applicative f => f (a -> b) -> f a -> f b Краткая суть
($) :: (a -> b) -> a -> b (<$>) :: Functor t => (a -> b) -> t a -> t b (<*>) :: Applicative t => t (a -> b) -> t a -> t b (=<<) :: Monad t => (a -> t b) -> t a -> t b :)

Страница 330 из 1551