Size: a a a

Scala Learning & Education: Ask for Review & Noob questions

2021 December 05

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
Иммутабельные или персистентные структуры можно сравнить с концепцией с самообъясняющим названием copy on write
источник

E

Egor in Scala Learning & Education: Ask for Review & Noob questions
Я проводил аналогии с синтаксисом, в книге написано, что этот код создает неизменяемое множество:

var jetSet = Set("Boeing", "Airbus")
 jetSet += "Lear"
 println(jetSet.contains("Cessna"))

Меня смутило то, что мы использовали var, далее в книге написано, что метод += используется только для изменяемых множеств, однако мы использовали его для неизменняемых.

А потом уже создается изменяемое множество

import scala.collection.mutable.Set
 val movieSet = Set("Hitch", "Poltergeist")
 movieSet += "Shrek"
 println(movieSet)

И тут уже используется val, меня это обескуражило, есть ли какая-то причина почему так?
источник

E

Egor in Scala Learning & Education: Ask for Review & Noob questions
Как например с кортежами, что индексация начинается с 1
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
ага, понятно, это действительно может смутить
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
в scala += имеет неоднозначный смысл,
в первом случае код эквивалентен записи

jetSet = jetSet + "Lear"

во втором - используется уже имеющийся метод += у мутабельного сета, это всё равно что написать

movieSet.+=("Shrek")

или, можно использовать аналогичный метод, как сказано в документации
https://www.scala-lang.org/api/2.13.x/scala/collection/mutable/Set.html

movieSet.addOne("Shrek")


Иными словами поведение комипилятора при a += b следующее -
1. Если есть метод += у типа переменной a, вызвать a.+=(b)
2. Если нет, но есть метод + и переменная объявлена как var - вызвать a = a + b
3... Перейти к неявным конверсиям
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
Соответственно, во втором случае мы просто добавляем элемент в изменяемый сет, а в первом - мы создаём новый неизменяемый сет и переприсваиваем переменную новому значению, примерно как это происходит с числами
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
Индексация не то, чтобы начинается с единицы, по сути у элементов тюплов нет индексов, только имена, соответствующие индексам.
Да, было принято решение дать имена, начиная с 1, это смущает, но т.к. никаких операций над именами вы как над индексами делать не можете, это почти ни на что не влияет
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
Думаю, здесь традиция идёт от функций доступа для двухместных кортежей, наиболее популярных в ФП исторически. Там их называют first и second, отсюда для соответствия названия _1 и _2, ну а потом уже по порядку
источник

E

Egor in Scala Learning & Education: Ask for Review & Noob questions
Большое спасибо
источник

Oℕ

Oleg ℕizhnik in Scala Learning & Education: Ask for Review & Noob questions
тут можно только сказать спасибо, что не car, cadr, caddr, cadddr и т.п.
источник

MB

Mikhail Belikov in Scala Learning & Education: Ask for Review & Noob questions
Привет. Посоветуйте, что лучше почитать по основам DOT (dependent object types). Уровень любой. Спасибо заранее :)
источник

R

Robert in Scala Learning & Education: Ask for Review & Noob questions
Привет
Пытаюсь создать простой ресурс
https://pastebin.com/tzCR3TY3
Подскажите, пожалуйста, почему на 7 строчку ругается, что Could not find an instance of Sync for Nothing?
источник

AD

Apache DOG™ in Scala Learning & Education: Ask for Review & Noob questions
Тайп параметры потому что
источник

R

Robert in Scala Learning & Education: Ask for Review & Noob questions
Как починить?
источник

ΛВ

Λнтон Войцишевский... in Scala Learning & Education: Ask for Review & Noob questions
Явно укажите
источник

ΛВ

Λнтон Войцишевский... in Scala Learning & Education: Ask for Review & Noob questions
readResource[F](_)
источник

R

Robert in Scala Learning & Education: Ask for Review & Noob questions
Спасибо большое!
Точно, надо было во всех местах явно передать параметр)
источник

ΛВ

Λнтон Войцишевский... in Scala Learning & Education: Ask for Review & Noob questions
его иногда можно не передавать, например если он однозначно выводится из аргумента:

trait Something[F[_]]{ ... }

def readResource[F[_]: Sync](smth: Something[F])(source: Source) = ...

def getDataFromUrl[F[_] : Sync](smth: Something[F])(url: String): F[String] =
   urlResource(url)
     .evalMap(readSource(smth)(_))
     .map(_.mkString)
     .use(str => Sync[F].delay(str))

в таком случае в readResource не нужно указывать тип
источник

ΛВ

Λнтон Войцишевский... in Scala Learning & Education: Ask for Review & Noob questions
код лучше скидывать в scastie
источник

R

Robert in Scala Learning & Education: Ask for Review & Noob questions
Благодарю за пояснения)
источник