Алексей
Ядовитые, т.е. от фри монад дохнут кони и программисты
Alexander
Я жив, брат тоже.
Alexander
Не надо думать, будто это не ФП, если кто-то так думает. Есть вещи, справедливые на уровне концепций. Концепция "разделяй и властвуй" в том или ином виде существует в инженерии ПО многие годы.
Алексей
Проблема то не в концепциях и ври монадах, а в том, что вас никто не понимает (я тоже)
Denis
по температуре в комнате можно было давно понять уровень интереса, имхо
Alexander
Ну потому что это уже более продвинутые штуки, и базу я не могу в двух словах передать.
Leonid 🦇
/r/iamverysmart
Denis
чего ж вы время тратите на нас, убогих таких?
Alexander
Давайте без токсичности.
A64m
вчера слушал подкаст, в котором говорили, что фримонады убивают скалу, а виноваты хаскелисты.
Alexander
Я пытаюсь решение предложить, если не ясно - задавайте вопросы
Зигохистоморфный
Давайте без токсичности.
ну я бы сделал так, не распинался тут в чате, а написал бы нормальную статью с номальным юзкейсом, а не просто дслку для простейшего языка где можно сложить 2 числа
Alexander
Окей, не нравятся фри монады, делайте интерпретируемые GADTs для элементов предметной области.
Leonid 🦇
Я считаю что пора задуматься об окончательном решении SOLID вопроса
Алексей
Давайте без токсичности.
Нельзя. Токсичность — защита от буллшита
Alexander
Я считаю что пора задуматься об окончательном решении SOLID вопроса
SOLID не имеет отношения к текущему разговору. Если у вас непонятно почему триггер на него, окей, забудьте
A64m
Нельзя. Токсичность — защита от буллшита
плохо помогает (но я люблю токсичность за саму токсичность, а не ее пользу)
кана
такс-такс, я не понял, тут против подхода "разделять интерфейс и реализацию" или конкретно фри-монад?
Denis
плохо помогает (но я люблю токсичность за саму токсичность, а не ее пользу)
хоть в процессе удовольствие приносит в неприятной обстановке, да
Alexander
Вот и я не очень понимаю, против каких конкоетно тезисов тут выступают и что называют буллщитом.
Dmitry
интерфейс и реализацию разделять - ок
Dmitry
SOLID если его расшифровывать звучит как булшит
Alexander
хоть в процессе удовольствие приносит в неприятной обстановке, да
Ну а в чем проблема? Обладаете знанием, как сделать лучше - пишите, рассказывайте.
Dmitry
полезность фримонад несколько преувеличена, и то, что можно сделать с ними, можно сделать и без них
A64m
но ведь таглесс-файнл лучше, разве нет?
Alexander
А чем плох принцип единственной ответственности?
Dmitry
ничем
Denis
но ведь таглесс-файнл лучше, разве нет?
тут на днях рассказывали что он засоряет код
Alexander
ничем
А чем плохо понимать подистему в терминах ее интерфейса, а не импдементации? Или в хаскельных программах не бывает подсистем?
Dmitry
ничем. дальше
Dmitry
идём
Dmitry
O
A64m
Final tagless == mtl style?
мтл-стайл это таглесс файнл, но второе более широкий термин, по моему, так что не равно.
Alexander
Open close. Чем плохо программировать данными некоего DSL, а не переписывать всю программу? Открыто для расширения? Да, пиши себе поведение. Закрыто для модификации? Да, DSL меняется редко (если задизайнен правчильно)
Denis
final tagless с монадами и эффектами никак не связан, так что очевидимо более широкое понятие
Dmitry
это не единственная возможность реализовать O.
Dmitry
например, вторая возможность - не расширять ADT (потому, что это модификация), а делать на типах / тайпклассах
Alexander
мтл-стайл это таглесс файнл, но второе более широкий термин, по моему, так что не равно.
В таком случае "тут на днях рассказывали, что он засоряет код" = false. Я про mtl говорил. Засоряет. И не всегда возможно чистую часть от нечистой отделить грамотно.
Dmitry
этот подход имеет право на жизнь, но он дико трудоемок, сложен и соответственно - не всегда оправдан
Leonid 🦇
@qnikst ты ждал https://twitter.com/phadej/status/961962557182562304
Dmitry
чем плохи DSL
Dmitry
тем, что когда ты пишешь на DSL, ты используешь haskell как намного более примитивный язык, лишенный почти всех возможностей
Dmitry
не всё можно напистать таким образом.
Dmitry
неважно
Dmitry
это верно для обоих
Denis
внутренний DSL - функция
A64m
тем, что когда ты пишешь на DSL, ты используешь haskell как намного более примитивный язык, лишенный почти всех возможностей
ну едсл-то более убогий язык, но зато остается хаскель как метаязык, во внешнем дсл такого не будет
Dmitry
"даже и такого не будет", да.
Dmitry
но зато сам внешний язык можно сделать хотя бы чуть более приличным, без штрафа на управляюшие конструкции
Leonid 🦇
А сервант отделяет интерфейс от реализации?
Dmitry
ну пожалуй что да
Alexander
Безусловно, есть в этом правда. Но вы _всегда_ пишете DSL. Пусть даже не очень выраженные. Код ршает задачу предметной области? Ну значит, он описывает эту предметную область и является Domain specific
Dmitry
там эту реализацию еще поди найди
Dmitry
а потом поди пойми
Alexander
это верно для обоих
Мой ответ был сюда
Dmitry
@lonokhov тайпклассы + тайп фэмили = отличный способ сокрытия реализации
Alexander
А сервант отделяет интерфейс от реализации?
Да. Если вы про интерфейс и реализацию непосредственно сервера
Dmitry
@lonokhov в смысле что даже когда её найдешь, еще поди в ней разберись
кана
тем, что когда ты пишешь на DSL, ты используешь haskell как намного более примитивный язык, лишенный почти всех возможностей
например? У меня просто есть подозрение, что ты про все те же условия, что неверно
Dmitry
те же - это какие?
Leonid 🦇
Этот чат начинает будить во мне токсичный кибербуллинг
кана
ну ты как-то говорил, что во фри-монадах нельзя делать if какой-нибудь и хотел какой-то If-конструктор добавлять, это все неверно
Dmitry
ну это штраф edsl на управляющие конструкции
Dmitry
все неверно - это что означает?
кана
ну так во фри-монадах это не нужно, там работает обычный if
Alexander
Этот чат начинает будить во мне токсичный кибербуллинг
А все. Сегодня последний день, когда япродаю эту идею в чатике на ближайшие два месяца.
Dmitry
непонятно, зачем там нужно всё остальное. короче, фримонады это такой паттерн GoF "template method", да?
кана
и я кидал, почему if работает, там же лямбда
кана
data T n = GetValue (Int -> n) | DoSmth String n do value <- getValue if value === 0 then doSmth1 "hello" else pure () -- ==> Free (GetValue (\value -> if value === 0 then Free (DoSmth1 "hello" (Pure ())) else Pure ()) отсюда и ветвления