169 похожих чатов

Народ у меня такой вопрос Сложилось ощущение что на практике фп

скалы чаще предпочитают использовать дуби, даже меня самого дуби подкупила очень понятной
механикой работы. Но вот сегодня поковырял slick (начиная с версии 3)
И почему то не нашел ничего такого - что дуби дает чего нет в слике 3
Интреполяторы запросов есть не менее мощные в слике
можно юзать тот же tsql и он даже в компайлтайме проверяет что
sql-ка правильная, и маппинги проверяет (правда для этого требует
указать подключение к базе, к которой подрубается в компайл тайме)
дуби в этом случае дает check тесты.
и вот возникает вопрос почему на практике все таки дуби начали
охотнее завозить? или может все таки я не прав и слик все таки большинство юзает и предпочитает?

27 ответов

23 просмотра

В дуби есть F[_], на этом, имхо, его преимущества заканчиваются, и начинается конкатенация строк.

Aybek-Hashimov Автор вопроса
Aλiaksandr Siamionau
В дуби есть F[_], на этом, имхо, его преимущества ...

я вот тоже думаю slick не любят потому что никто не хочет писать Task.deferFromFuture(db.run(...)) А может ли вследствии этого теряться производительность? Типа slick всегда в Future выводится а дуби более универсальный Или если обернуть Future в Таску - то все будет ок?

Aybek Hashimov
я вот тоже думаю slick не любят потому что никто н...

В слике это всё тоже можно абстрагировать слоем сверху, никакой потери производительности на этой чепухе нет.

Aybek Hashimov
я вот тоже думаю slick не любят потому что никто н...

пишешь в фп стеке — пиши с фп либами, которые дизайнили под фп, такое вот правило пальца имхо

Aλiaksandr Siamionau
И на фп виртуальной машине :)

фп важно для программиста на уровне его взаимодействия с кодом, а не на уровне исполнения кода в ВМ или еще где

Aybek-Hashimov Автор вопроса
Aλiaksandr Siamionau
слик вполне себе фп

согласен странная логика говорить раз не F[_] то не ФП типа не служил не мужик)

Aλiaksandr Siamionau
слик вполне себе фп

val setupFuture = db.run(setup) футуры исполняются сразу и следовательно не соблюдают ссылочную прозрачность как минимум. Значит не фп (не в понимании «фп ето программирование с ФВП»)

Aybek Hashimov
согласен странная логика говорить раз не F[_] то н...

да хоть голое ИО/ЗИО/моникстаск, необязательно тф

Aybek Hashimov
Task.deferFromFuture(db.run(setup))

я это и имею в виду под «не задизайнено под фп-подход с сохранением СП» — надо каждый чих заворачивать в такое вот

Tachi Войцишевский
val setupFuture = db.run(setup) футуры исполняютс...

Частично согласен, но db.run вызывать самому необязательно. Это всё в прослойке (тонкой).

Tachi Войцишевский
фп важно для программиста на уровне его взаимодейс...

программист, который не шарит в том как исполняется код в ВМ, иногда пишет очень стрёмный в плане перформанса код два топ примера из практики на втором месте .toMap который вызывали на mutable кеше, который мог быть большой 10-20 мб, несколько сотен раз в секунду чтобы получить immutable Map там дальше ни на что это вообще не влияло убрать .toMap - минус 60 процентов primary allocation, минус 30 процентов загрузки прода (а прод тогда был 72 ядра) а на первом месте - lazy val за каким-то хером в теле метода, которая тогда (2.11 по-моему скала ещё была) автоматически становилась глобальным тред локом для всех тредов, которые этот метод вызывают так что фп важно для программиста all the way down

Tim
программист, который не шарит в том как исполняетс...

ну там не совсем про это была реплика. Я говорил о том, что ФП дает бенефиты именно на этапе чтения/написания/поддержки кода и архитектуры, а смысла фанатично требовать тру-фпшность на всех уровнях нет. Поэтому например нормально внутри скаластд коллекций видеть вайлтру и прочие мутабельные штуки, и иметь вполне себе нетруфп-грязную-какещехотите жвм

Tachi Войцишевский
ну там не совсем про это была реплика. Я говорил ...

а, ну по-моему достаточно посмотреть в имплементации скала коллекций с var и прочим

Aybek-Hashimov Автор вопроса
Tachi Войцишевский
ну там не совсем про это была реплика. Я говорил ...

while truшки в локальных методах это вполне себе ФП если я не ошибаюсь называется локализованный эффект

Aybek-Hashimov Автор вопроса
Aλiaksandr Siamionau
Частично согласен, но db.run вызывать самому необя...

есть ссылки где можно глянуть как это сделать? Я щас обычно фигачу везде deferFromFuture - не оч красиво

Aybek Hashimov
есть ссылки где можно глянуть как это сделать? Я щ...

Ты можешь вообще не писать нигде db.run. Например, можно репозитории автоматически переводить из DBIO в твой F. Например, если есть какой-то Repo trait UserRepo[F[_]] { def findUserByEmail(email: Email): F[Option[User]] } class UserRepoImpl(...) extends UserRepo[DBIO] { // ... } То, имея ~> выше, можно с помощью cats-tagless превратить твой UserRepo[DBIO] в UserRepo[F]. implicit val functorKUserRepo: FunctorK[UserRepo] = Derive.functorK[UserRepo] userRepoImpl.mapK(transact) И транзакции будут выполнять автоматически при покидании DB слоя.

Tim
программист, который не шарит в том как исполняетс...

Осталось только понять причём тут знание виртуальной машины

Vladislav Golub
Осталось только понять причём тут знание виртуальн...

вм как среды исполнения фп кода - в широком смысле, везде где это критично

Tim
вм как среды исполнения фп кода - в широком смысле...

если говорить про тайплевел/зио/моникс, то для «фп кода» там используется не сама жвм, а отдельный рантайм поверх нее (собственно ИО-ЗИО-Таск)

Tim
вм как среды исполнения фп кода - в широком смысле...

ну и описанные «беды» были и правда не с ВМ, а с деталями реализации стдлибы или языка

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта