Size: a a a

Scala User Group

2020 May 29

AT

Aλeksei Tereχin in Scala User Group
типа fa.as(b) в синтаксисе функтора
источник

λƒ

λesha ƒomkin in Scala User Group
спасибо!
источник

AA

Artem Artem in Scala User Group
Гайз, привет, у меня тут несложная вроде проблема, но никак не могу решить, может кто-нибудь сталкивался с чем-то подобным?

def printData[F[_] : Monad](data: List[String], pdfDoc: PdfDocument[F]): F[Unit] = {
 if (data.isEmpty) {
   pdfDoc.pure()
 } else {
   for {
     _ <- pdfDoc.addText(data.head)
   } yield {
     printData(data.tail, pdfDoc)
   }
 }

}


Тут простая рекурсия, PdfDocument[F] => PdfDocument[Future] в этом случае
так вот
Если оставить рекурсивный вызов внутри for comprehension, то не получается tail рекурсия
Если вынести, то метод заканчивается раньше, чем отрабатывают Future и результат получается неправильным
источник

VE

Vasiliy Efimov in Scala User Group
addText возвращает F[Unit]?
источник

AA

Artem Artem in Scala User Group
да
я пользуюсь java библиотекой, которая делает что-то там и ничего не возвращает
так что F[Unit]
источник

М

Михаил in Scala User Group
а зачем тут рекурсия, а не data.traverse(pdfDoc.addText)?
источник

VE

Vasiliy Efimov in Scala User Group
тогда казалось бы
pdfDoc.addText(data.head) >> printData(data.tail, pdfDoc)

должно сработать, в приведённом коде получается F[F[Unit]]
источник

KS

Kirill Shelopugin in Scala User Group
У футуры стекобезопасный flatMap, так что способы и Михаила и Василия одинаково пригодны
источник

VE

Vasiliy Efimov in Scala User Group
Если ваша монада не - стекобезопасна, такой трюк конечно не сработает, и придётся использовать tailRecM, хвостовой рекурсии тут не получится, потому что последний вызов - не просто вызов функции, а flatMap

https://typelevel.org/cats/typeclasses/monad.html#tailrecm
источник

VE

Vasiliy Efimov in Scala User Group
Михаил
а зачем тут рекурсия, а не data.traverse(pdfDoc.addText)?
лучше так сделай, это проще, учитывая что F абстрактный
источник

AA

Artem Artem in Scala User Group
Спасибо всем большое)
Почитаю и попробую так сделать
источник

KS

Kirill Shelopugin in Scala User Group
источник

P

Python in Scala User Group
Нубский вопрос. Сто раз наверное обсуждали, но всё же.

Преположим у меня есть case class Context(cats: Int, dogs: Int).

И, предположим у меня есть MonadState[F, Context]. И я хочу получить нужный MonadState[F, Int].

meow-mtl позволяет мне это сделать просто вызвав MonadState[F, Int], но он, как я понимаю, выбирает по типу, то есть я не могу выбрать dogs это будет или cats.

Может есть готовые решения которые позволят такое делать без заворачивания cats и dogs во врапперы?
источник

λ

λoλcat in Scala User Group
Python
Нубский вопрос. Сто раз наверное обсуждали, но всё же.

Преположим у меня есть case class Context(cats: Int, dogs: Int).

И, предположим у меня есть MonadState[F, Context]. И я хочу получить нужный MonadState[F, Int].

meow-mtl позволяет мне это сделать просто вызвав MonadState[F, Int], но он, как я понимаю, выбирает по типу, то есть я не могу выбрать dogs это будет или cats.

Может есть готовые решения которые позволят такое делать без заворачивания cats и dogs во врапперы?
Решение называется ньютайпы.
источник

P

Python in Scala User Group
λoλcat
Решение называется ньютайпы.
😭
источник

λ

λoλcat in Scala User Group
Еще в тофу классиоптики на 2.13 тэгают линзы лейблом с именем поля, так что они получаются различимы
источник

VS

Vladimir Sam in Scala User Group
doobie-знатоки, подскажите куда смотреть, чтобы понять во что превращается вызов
sql"".query.stream
и понять как он интерпретируется?
источник

VS

Vladimir Sam in Scala User Group
чето у моникса все в разы проще в кишках
источник

P

Python in Scala User Group
Vladimir Sam
doobie-знатоки, подскажите куда смотреть, чтобы понять во что превращается вызов
sql"".query.stream
и понять как он интерпретируется?
Он же при компиляции прямо в консоль выводит во что превращается, не?
источник

λ

λoλcat in Scala User Group
Vladimir Sam
doobie-знатоки, подскажите куда смотреть, чтобы понять во что превращается вызов
sql"".query.stream
и понять как он интерпретируется?
А что непонятно?
источник