Size: a a a

2021 March 15

ΛВ

Λнтон Войцишевский... in Scala Jobs
Artem Sokolov
скока раз приседать нада?
я уверен, что даже в тематических видосах на ютубе расскажут больше и лучше, чем тут

https://kneesovertoesguy.medium.com/

у вот этого чувака есть канал и статьи про офп с фокусом на суставы
источник

БЁ

Борщевик Ёбаный... in Scala Jobs
уезжая с кавказа забугор программировать я не думал, что и здесь рассказы про качалку будут
источник

ΛВ

Λнтон Войцишевский... in Scala Jobs
ὦan
как дела?
слоумод до 30 секунд можно сделать?
источник

ὦan in Scala Jobs
Λнтон Войцишевский
слоумод до 30 секунд можно сделать?
хорошо
источник

ΛВ

Λнтон Войцишевский... in Scala Jobs
спасибо
источник

AK

Aleksey Kislitsa in Scala Jobs
Αγβεκ
  override def foldRight[B](z: B)(op: (A, B) => B): B =
   reverse.foldLeft(z)((right, left) => op(left, right))

 def fold[A1 >: A](z: A1)(op: (A1, A1) => A1): A1 = foldLeft(z)(op)

Не думаю
Тогда стоит кликнуть дальше и посмотреть, что сейчас они обе не рекурсивны
  def reduceLeft[B >: A](op: (B, A) => B): B = {
   val it = iterator
   if (it.isEmpty)
     throw new UnsupportedOperationException("empty.reduceLeft")

   var first = true
   var acc: B = null.asInstanceOf[B]

   while (it.hasNext) {
     val x = it.next()
     if (first) {
       acc = x
       first = false
     }
     else acc = op(acc, x)
   }
   acc
 }

  def foldLeft[B](z: B)(op: (B, A) => B): B = {
   var result = z
   val it = iterator
   while (it.hasNext) {
     result = op(result, it.next())
   }
   result
 }

Собственно теперь вся разница в параметрах, в fold ты начальное значение задаешь сам, в reduce это первый эелемент переданного списка.
Но вот во времена скалы 2 на курсе Одерского была задача реализовать эти функции самостоятельно и там помоему в дибе было рекурсивное определение фолдов и в обсуждении упоминалось, что праввуфй фолд через хвостовую рекурсию.
Но опять таки, доказывать не буду, может и склероз и речь шла только о рекурсивном пользовательском определении.
источник

DS

Denis Sadovskiy in Scala Jobs
Artem Sokolov
скока раз приседать нада?
Не знаю, вам может не надо. Это личное дело каждого
источник

Α

Αγβεκ in Scala Jobs
Aleksey Kislitsa
Тогда стоит кликнуть дальше и посмотреть, что сейчас они обе не рекурсивны
  def reduceLeft[B >: A](op: (B, A) => B): B = {
   val it = iterator
   if (it.isEmpty)
     throw new UnsupportedOperationException("empty.reduceLeft")

   var first = true
   var acc: B = null.asInstanceOf[B]

   while (it.hasNext) {
     val x = it.next()
     if (first) {
       acc = x
       first = false
     }
     else acc = op(acc, x)
   }
   acc
 }

  def foldLeft[B](z: B)(op: (B, A) => B): B = {
   var result = z
   val it = iterator
   while (it.hasNext) {
     result = op(result, it.next())
   }
   result
 }

Собственно теперь вся разница в параметрах, в fold ты начальное значение задаешь сам, в reduce это первый эелемент переданного списка.
Но вот во времена скалы 2 на курсе Одерского была задача реализовать эти функции самостоятельно и там помоему в дибе было рекурсивное определение фолдов и в обсуждении упоминалось, что праввуфй фолд через хвостовую рекурсию.
Но опять таки, доказывать не буду, может и склероз и речь шла только о рекурсивном пользовательском определении.
блин специально не хотел лезть в foldLeft
развидеть развидеть
источник

K-

Konstantin - in Scala Jobs
Борщевик Ёбаный
собеседующие если их больше одного могут начать сраться между собой
👍😂
источник

AK

Aleksey Kislitsa in Scala Jobs
Αγβεκ
блин специально не хотел лезть в foldLeft
развидеть развидеть
"Рекурсия приди!" и зачетку в окошко кидать 😇
источник

A

Alex in Scala Jobs
Aleksey Kislitsa
Тогда стоит кликнуть дальше и посмотреть, что сейчас они обе не рекурсивны
  def reduceLeft[B >: A](op: (B, A) => B): B = {
   val it = iterator
   if (it.isEmpty)
     throw new UnsupportedOperationException("empty.reduceLeft")

   var first = true
   var acc: B = null.asInstanceOf[B]

   while (it.hasNext) {
     val x = it.next()
     if (first) {
       acc = x
       first = false
     }
     else acc = op(acc, x)
   }
   acc
 }

  def foldLeft[B](z: B)(op: (B, A) => B): B = {
   var result = z
   val it = iterator
   while (it.hasNext) {
     result = op(result, it.next())
   }
   result
 }

Собственно теперь вся разница в параметрах, в fold ты начальное значение задаешь сам, в reduce это первый эелемент переданного списка.
Но вот во времена скалы 2 на курсе Одерского была задача реализовать эти функции самостоятельно и там помоему в дибе было рекурсивное определение фолдов и в обсуждении упоминалось, что праввуфй фолд через хвостовую рекурсию.
Но опять таки, доказывать не буду, может и склероз и речь шла только о рекурсивном пользовательском определении.
Там есть фолдр который с эвалом в аккумуляторе. У него семантика такая что, он сначала пытается пройти максимально вперёд рекурсивно (ты сам ограничиваешь до куда) и потом сворачивается назад
источник

A

Alex in Scala Jobs
В хаскеле похожая история только из-за лейзи модели там вроде все без эвала работает
источник

A

Alex in Scala Jobs
Уже подзабыл
источник

A

Alex in Scala Jobs
Так что там суть не только в рекурсии
источник

AK

Aleksey Kislitsa in Scala Jobs
Alex
Там есть фолдр который с эвалом в аккумуляторе. У него семантика такая что, он сначала пытается пройти максимально вперёд рекурсивно (ты сам ограничиваешь до куда) и потом сворачивается назад
Не нашел сейчас такого 😿
источник

A

Alex in Scala Jobs
cats.Foldable#foldRight чекни
источник

Α

Αγβεκ in Scala Jobs
Aleksey Kislitsa
Не нашел сейчас такого 😿
точно в котах смотришь?
источник

AK

Aleksey Kislitsa in Scala Jobs
Αγβεκ
точно в котах смотришь?
Блин... точно не в котах
источник

Α

Αγβεκ in Scala Jobs
Alex
Там есть фолдр который с эвалом в аккумуляторе. У него семантика такая что, он сначала пытается пройти максимально вперёд рекурсивно (ты сам ограничиваешь до куда) и потом сворачивается назад
получается он строит эту ленивую конструкцию из Eval
понятно что стек не взорвешь - но может ведь случится что в куче
создастся довольно большая структура
источник

A

Alex in Scala Jobs
все збс будет
источник