powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Scala
25 сообщений из 94, страница 3 из 4
Scala
    #39452678
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateЧасто вижу люди упоминают что язык Х не такой мощный как Скала. Инересно увидеть пример кода на Скале демонстрирующий это, желательно короткий который демонстрирует это. Но реальный, не просто какой-то абстрактный функтор или монада, а привязанное к чему-то совершенно реальному и практичному, т.е. этот пример должен реально использоваться и использоватся часто и приностиь значительную пользу .

в java8 такой фокус тоже сработает, но тем не менее, смотрите как изящно делаем HashMap
Код: sql
1.
2.
val profiles = profileService.findByParameters(Parameters(email = '%foo%'))
val profilesById = profiles.map(p => p.id -> p).toMap




или вот, наглядная обработка условий с match. код читаемый, легко правится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
@RequestMapping(value=Array("/profiles/id"))
@ResponseBody
def loadProfileById(id: Int) = {
   profileService.findById(id).profile match {
      case Some(profile) => 
          WebProfile.fromDto(profile).toJson()
      
      case None =>
          throw ObjectNotFoundException(s"Profile with id=$id not found")
   }
}
...
Рейтинг: 0 / 0
Scala
    #39452688
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Буквально из вчерашнего:
Код: java
1.
2.
3.
4.
case class JsResource(path: Path, dependencies: List[JsResource]) //файл и его зависимости, формируют дерево

//получить множество всех зависимостей из дерева 
def flatDependencies(root: JsResource): Set[Path] = root.dependencies.flatMap(flatDependencies).toSet + root.path
...
Рейтинг: 0 / 0
Scala
    #39452695
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щиче...Например, был такой язык PL/I. Вчистую проигравший С и Pascal...
Спорное утверждение

PL/I AFAIK был заточен на IBM 360 ее продолжение и клоны
C и Pascal'у проиграть не мог, когда я в начале 90-х сидел на ЕС ЭВМ там ни C, ни Pascal не было. Как можно проиграть тому, кого нет?

Ну и синтаксис был заточен под IBM 360. Последовательные файлы, индексно организованные и так далее. Фиг такой язык на другую ОС перенесешь. Где файл это файл и все ))) без всяких выпендрежей с прямым доступом к нужным цилиндрам диска )))

IMHO & AFAIK
...
Рейтинг: 0 / 0
Scala
    #39452711
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateЧасто вижу люди упоминают что язык Х не такой мощный как Скала. Инересно увидеть пример кода на Скале демонстрирующий это, желательно короткий который демонстрирует это. Но реальный, не просто какой-то абстрактный функтор или монада, а привязанное к чему-то совершенно реальному и практичному, т.е. этот пример должен реально использоваться и использоватся часто и приностиь значительную пользу .
Мы не сможем определиться с критериями "значительной пользы". У нас нет возможности обсуждать серъезные SR
в рамках sql.ru. Во первых никто их не будет читать и во вторых не секюрно и т.п.

Но меня-бы вполне устроили обычные кейсы рефакторинга, когда есть какой-то ящик с входом и выходом,
написанный на Java/C++/C#/Delphi. Желательно не более чем на 100 строк.

И мы (все) внимательно на него смотрим. Думаем. И применяем к нему рефакторинги которые
- сокращают его объем кода.
- делают его более maintainable
- делают его более Human-readable

Далее мы пытаемся реализовать этот черный ящик на Scala и смотрим какой профит мы с этого
получаем. Если ничего не получаем - то считаем что в данном кейсе язык X такой-же мощный
как Scala или Scala не дает никаких преимуществ.

P.S.

В топике по трассировкой луча я сделал наивную попытку просто перевести С++ в Scala но получил
(пока) ошибку рендеринга и к сожалению ее не исправил т.к не хватает времени разобраться.

В топике где Atum играл с Stream-s и решал искусственные задачки я предложил решить те-же
задачки на Scala но к сожалению не получил поддержки аудитории да и самому мне тогда не было
времени их решать.
...
Рейтинг: 0 / 0
Scala
    #39452820
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА теперь прошу - то же самое на джаве.А я не говорил что приведу ответ на Java :), ниже пример на TypeScript (я использовал интерфейсы, но с классами тоже можно, и да, он тоже сделает автокастинг и проверку корректных значений в свитче и если мы забудем ретурн сделать тоже подскажет).

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
interface Dot    { type: 'Dot', x: number, y: number }
interface Circle { type: 'Circle', x: number, y: number, r: number }
interface Square { type: 'Square', x1: number, y2: number, y1: number, y2: number }

type Shape = Dot | Circle | Square

let area = (s: Shape): number {
  switch (s.type) {
    case 'Dot'    : return 0
    case 'Circle' : return Math.PI * s.r * s.r
    case 'Square' : return (s.x2 - s.x1) * (s.y2 - s.y1)
  }
}
...
Рейтинг: 0 / 0
Scala
    #39452827
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторval profiles = profileService.findByParameters(Parameters(email = '%foo%'))
val profilesById = profiles.map(p => p.id -> p).toMap

Аналогично на тайпскрипте. Чуть длиннее, но в общем терпимо.

Код: javascript
1.
2.
3.
4.
5.
// let profiles: any = [{ email: 'some-email', id: 'aid' }] 
let profilesById = profiles
  .filter(({ email }) => email == 'some-email')
  .reduce((map, profile) => { map[profile.id] = profile; return map }, {})
// alert(JSON.stringify(profilesById))
...
Рейтинг: 0 / 0
Scala
    #39452829
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
def loadProfileById(id: Int) = {
   profileService.findById(id).profile match {
      case Some(profile) => 
          WebProfile.fromDto(profile).toJson()
      
      case None =>
          throw ObjectNotFoundException(s"Profile with id=$id not found")
   }
}




Опять на тайп-скрипте (он перехватит все нулл поинтеры и заставит сдлать проверку на нул если ее например пропустить). На мой взгляд эта версия проще, короче и понятней.

Код: javascript
1.
2.
3.
4.
5.
loadProfileById(id: number): Profile {
  let profile = Profiles.findById(id)
  if (!profile) throw new NotFound(`profile with ${id} not found!`)
  return profile
}



Но, можно сделать еще лучше, так как это делается например в Рельсах, нужно прокетировать апи сервиса так чтобы он сам все проверял. В коде ниже `one()` выкинет ошибку если найдено 0 или > 1.

Код: javascript
1.
2.
3.
loadProfileById(id: number): Profile {
  Profiles.where({ id }).one()
}
...
Рейтинг: 0 / 0
Scala
    #39452834
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторcase class JsResource(path: Path, dependencies: List[JsResource]) //файл и его зависимости, формируют дерево

//получить множество всех зависимостей из дерева
def flatDependencies(root: JsResource): Set[Path] = root.dependencies.flatMap(flatDependencies).toSet + root.path


Хммм, а из-за циркулярных зависимостей в бесконечный цикл не войдет?
...
Рейтинг: 0 / 0
Scala
    #39452840
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
private,

тайпскрипт - вещь хорошая, но это надстройка над яваскриптом с необязательными типами. Так сказать, другая весовая категория, и до роли промышленного языка больших систем он еще не дорос.

Войдет, но, по условию задачи, это дерево, а не граф.
...
Рейтинг: 0 / 0
Scala
    #39452844
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Версия на тайпскрипт. Немного нечитабельно, основная проблема - отсутствие метода `flatten` в жаваскрипте...

Код: javascript
1.
2.
3.
4.
5.
interface JsResource { path: string, dependencies: JsResource[] }
let flatDependencies = (root: JsResource): string[] => (     
  [].concat.apply([root.path], root.dependencies.map(flatDependencies))
)
alert(JSON.stringify(flatDependencies({ path: '/a', dependencies: [{ path: '/b', dependencies: []}]})))



С флаттен было-бы читабельней.

Код: javascript
1.
2.
3.
let flatDependencies = (root: JsResource): string[] => (
  [root.path].concat(root.dependencies.map(flatDependencies).flatten()
)
...
Рейтинг: 0 / 0
Scala
    #39452847
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я забыл в Set обернуть... Последний пример подкачал..., уступает скале из-за отсутствия хорошей стандартной библиотеке в жаваскрипт.
...
Рейтинг: 0 / 0
Scala
    #39452866
забыл ник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересная позиция конечно:) по типу суровых русских дровосеков с японской бензопилой

Ну например сделай на typescript такое -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
//Интерфейс объекта к которому можно прицепить слушателя
trait Observable {

  type Handle

  protected var callbacks = Map[Handle, this.type => Unit]()

  def observe(callback : this.type => Unit) : Handle = {
    val handle = createHandle(callback)
    callbacks += (handle -> callback)
    handle
  }

  def unobserve(handle : Handle) : Unit = {
    callbacks -= handle
  }

  protected def notifyListeners() : Unit =
    for(callback <- callbacks.values) callback(this)

  /**
   * Subclasses override this to provide their own callback disambiguation scheme.
   */
  protected def createHandle(callback : this.type => Unit) : Handle
}

trait DefaultHandles extends Observable {
  type Handle = (this.type => Unit)
  protected def createHandle(callback : this.type => Unit) : Handle = callback
}

class VariableStore[X](private var value : X) extends Observable with DefaultHandles {
  def get : X = value
  def set(newValue : X) : Unit = {
    value = newValue
    notifyListeners()
  }

  override def toString : String = "VariableStore(" + value + ")"
}



А теперь как им пользоваться -

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
// Создаем два разных объекта одного типа
scala> val x = new VariableStore(5)   
x: VariableStore[Int] = VariableStore(5)
scala> val y = new VariableStore(2)
y: VariableStore[Int] = VariableStore(2)    

// Простой коллбэк, который печатает в стандартный вывод
scala> val callback = println(_ : Any)
callback: (Any) => Unit = <function1>

// Хендлы нужны для того чтобы потом можно было отписаться от нотификейшенов. Handle1 и handle2 - два разных хандлера
scala> val handle1 = x.observe(callback)
handle1: (x.type) => Unit = <function1>

scala> val handle2 = y.observe(callback)
handle2: (y.type) => Unit = <function1>

// Проверяем что обсерверы работают, когда выставляем значение - оно выводится на консоль
scala> y.set(3)
VariableStore(3)

scala> x.set(5)
VariableStore(5)

// И вот тут начинается магия - Мы пытаемся отписаться от нотификейшенов на объект y, используя handle от объекта x - компилятор дает нам жесткий отлуп. Да - да компилятор может отловить если метод вызван не то что на неправильном типе, а на неправильном ИНСТАНСЕ объекта одного и того же типа.
scala> y.unobserve(handle1)
<console>:10: error: type mismatch;
 found   : (x.type) => Unit
 required: (y.type) => Unit
       y.unobserve(handle1)

scala> x.unobserve(handle1)
//Ok, отписались
scala> x.set(6)
//на консоль ничего не выводится



Да, я не скажу что такое надо сплошь и рядом, и сама концепция path-dependent types трудна, но если использовать дозированно и к месту, то можно прилично помочь компилятору. Жду аналог на TS
...
Рейтинг: 0 / 0
Scala
    #39453141
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как раз наоборот. Я продемонстрировал что "Японская Бензопила" (обычный язык, тайпскрипт) неплохо справиляется с предложенными выше практическими и часто встречающимися задачами. А ты предложил перепелить рельс - привел пример абстрактного, редко используемого кода. Я же явно упоминул что желательно рассматривать """"ример должен реально использоваться и использоватся часто и приностиь значительную пользу""". Какой смысл рассматривать фичу языка которая используется редко и приносит незначительную пользу?
...
Рейтинг: 0 / 0
Scala
    #39453144
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По приведенному коду - нужно определится - либо он частно используется в проектах на скале и приносит значимю пользу (и желательно продемонстрировать реальным кодом - как именно он эту пользу приносит, как в примерах выше, там явно видно что это обычный рабочий код, рендеринг обьектов, работа с базой данных и т.п.). Либо отбросить его как несущественный.
...
Рейтинг: 0 / 0
Scala
    #39453579
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonHettПодытожив все прочитанное вчера (а мыслей было на много больше чем я тут написал, что-то уж из головы все вылетело) - пришел к выводу, что это скорее инструмент фанатиков, помешанных на "идеальном коде", которые больше времени теоретизируют.

Что скажете?

Кину 5 копеек.

Языки программирования создают не боги и не небожители. А обычные инженеры (зачастую). Языки
становятся на долгие десятилетия стандартом общения между программистом и имплементацией.
Как следствие. Ошибки или недостатки которые заложил создатель мы тащим долгие годы.
Почему Джеймс Гослинг не заложил в java парадигму беззнаковой арифметики. Ведь процессоры
прекрасно это поддерживали? Почему в первых версиях не было типа enum, не было generics,
и не было семантики строкового аргумента внутри switch? Почему API сразу не поддержал
out.printf, а потребовалось несколько лет чтобы осознать что это реально практично и полезно?
Почему строки нужно сравнивать только через equals() а не через более короткий binary operator?
Почему нельзя перегрузить + для сложения матриц и векторов? В какой-такой концепции ООП
записано что этого делать нельзя? И такой поток "почему" у меня - бесконечен.

И с другой стороны. Мартин Одерский. Профессор. Да еще и специализируется на ЯЗЫКАХ.
Этот человек знает всё о всех парадигмах. Он не стал размениваться на мелочи.
Он заложил в Scala ВСЕ-ВСЕ языковые парадигмы которые только существуют.
Серъезно! Там только чорта в ступе не хватает. И если вы однажды (с похмелья)
вдруг решили создать свой язык или DSL или скриптик .. то замрите (!) на минуточку
и вспомните что в Scala это уже есть! Натурально. Фундаментальные стратегии
работы с коллекциями такие как map, flatMap, fold воплощены в scala в то время
как в Java к ним только-только подходят и то без понимания сути а инструментально,
как побочка от работы со Streams. В Scala можно постулировать не то что жалкое
целое число или комплексное или вектор. Можно объявить "группы", "кольца"
и прочие материи высокого порядка математики и далее унаследовать от них
поведение. В Scala решена проблема ромбовидного наследования. Решена бротва!
Вы всё спорите в топиках ООП? Так знайте! Она - формализована в Scala и результат
детерминирован. Никакого UB! Scala - статически типизирована на уровне компиллятора.
А это значит что мы получаем формальное доказательство правоты нашего
алгоритма после компилляции целого леса шаблонов и функций. И это значит
что никаких ошибок рантайма при кастинге не будет! Это - закон! А что
может быть лучше для программиста чем закон который гарантирует
что код - верный.

И еще раз. В Scala есть всё! Если чего-то нет - то читайте внимательно.

Я сейчас не говорю о практике или о статистике использования этого ЯП.
Это отдельный вопрос. Но теоретический батл Java уже давно проиграла.
Что может инженеришко Гослинг противопоставить профессору языковых
наук Одерскому!? Это вам не хер собачий! Это академичский подход.
Это - наука! А не дурацкие фреймворки с бинами. Мдя....

Я не имею ентерпрайзных проектов на Scala. И его пока не знаю
так хорошо чтобы трабл-шутить ошибки. Но у меня достаточно
сильно развито природное инженерное любопытство которое будет
и будет двигать меня в сторону этого сложного и интересного языка.

Вот такие вот 5 копеек. Спасибо за внимание.


+1
...
Рейтинг: 0 / 0
Scala
    #39453580
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
privateЧасто вижу люди упоминают что язык Х не такой мощный как Скала. Инересно увидеть пример кода на Скале демонстрирующий это, желательно короткий который демонстрирует это. Но реальный, не просто какой-то абстрактный функтор или монада, а привязанное к чему-то совершенно реальному и практичному, т.е. этот пример должен реально использоваться и использоватся часто и приностиь значительную пользу .

Вся научная разработка компании huawei идет на scala
...
Рейтинг: 0 / 0
Scala
    #39453686
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл ник
Ну например сделай на typescript такое -


https://github.com/Reactive-Extensions/RxJS
...
Рейтинг: 0 / 0
Scala
    #39453774
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1privateЧасто вижу люди упоминают что язык Х не такой мощный как Скала. Инересно увидеть пример кода на Скале демонстрирующий это, желательно короткий который демонстрирует это. Но реальный, не просто какой-то абстрактный функтор или монада, а привязанное к чему-то совершенно реальному и практичному, т.е. этот пример должен реально использоваться и использоватся часто и приностиь значительную пользу .

Вся научная разработка компании huawei идет на scala
Из того что уже написано и работает на Scala - можно отметить фреймвоки Akka и Kafka.

Этот пример кода не очень короткий и я-бы даже сказал весьма длинный. Но можно брать
из него фрагменты и думать чё там и как. Я его код не смотрел но думаю что он - весьма
достоен своего выбора.
...
Рейтинг: 0 / 0
Scala
    #39454198
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВзабыл никНу например сделай на typescript такое -


https://github.com/Reactive-Extensions/RxJS

Это совсем не о том.. Observables - лишь пример. Идея в том, что многие потенциальные ошибки в скале можно отличить уже на этапе компиляции (а не в логах на продуктиве, как это обычно бывает)

Scala имеет более строгую типизацию, чем Java, C# или Typescript. Говорят, что есть ещё более строгие языки со странными названиями - Haskell, Idris, Agda... Но я вот с ними не сталкивался. Ну и работодатели, видимо, тоже.
...
Рейтинг: 0 / 0
Scala
    #39454443
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Диез
Scala имеет более строгую типизацию, чем Java, C# или Typescript.
Scala имеет более мощную систему типов, чем Java, C#. Typescript - немного в стороне, хотя в C# есть dynamic...
То, что показано в примере - примеси, на C# легко реализуются с помощью интерфейсов и методов расширения, которые там появились 100500 лет назад.
В 7,0 появился pattern matching, но он сильно уступает scala и f#.
...
Рейтинг: 0 / 0
Scala
    #39454481
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги, система типов Scala - это вещь хорошая, но не прикладная и уж точно не то, за все мы так любим этот язык для разработки.

Вот еще немного моего любимого:
Код: java
1.
2.
package com.company.mylib.impl
private[mylib] class SomeImpl {...} //доступен только из пакета mylib и подпакетов (mylib.impl)



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
sealed trait State
case object Stopped extends State
case class Starting(started: Runnable)
case object Started
case class Stopping(stopped: Runnable)
val state = new AtomicReference[State](Stopped)

//потокобезопасно и достаточно сложно в реализации на Java
def start(started: Runnable): Unit = state.get() match {
  case st @ Stopped => if (!state.compareAndSet(st, Starting(started))) start(started) //если остановлено - запускаем
  case Starting(_) => //уже запускается, ничего не делаем
  case Started => started.run() //уже запущено - вызываем callback сразу
  //если сейчас останавливается - то запускаем после окончания остановки
  case st @ Stopping(cb) = if (!state.compareAndSet(st, Stopping(() => {cb.run() ; start(started)})) start(started)
}



Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
//вернуть сумму трех Option-ов, если все они существуют
def sumAll(a: Option[Int], b: Option[Int], c: Option[Int]): Option[Int] = for {
   av <- a
   bv <- b
   cv <- c
} yield a + b + c

//вернуть сумму всех существующих Option-ов
def sumAny(a: Option[Int], b: Option[Int], c: Option[Int]): Option[Int] = 
  a.getOrElse(0) + b.getOrElse(0) + c.getOrElse(0)

//вернуть сумму всех существующих Option-ов (вариант 2)
def sumAny(a: Option[Int], b: Option[Int], c: Option[Int]): Option[Int] = {
  var sum = 0
  a.foreach { v => sum += v }
  b.foreach { sum += _ } //то же самое
  с.foreach { sum += _ } 
  sum
}

def max(a: Int, b: Int) = 
  if (a > b) 
    a //здесь могла бы быть ваша рекламафигурная скобка и кусок кода, return не нужен
  else 
    b
...
Рейтинг: 0 / 0
Scala
    #39454484
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scf,

Поправка ко второму примеру:
Код: java
1.
2.
3.
4.
case object Stopped extends State
case class Starting(started: Runnable) extends State
case object Started extends State
case class Stopping(stopped: Runnable) extends State
...
Рейтинг: 0 / 0
Scala
    #39454518
scf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
scf,

И еще одна поправка ко второму примеру
Код: java
1.
2.
//вызовем callback когда запустится
case st @ Starting(cb) => if (!state.compareAndSet(st, Starting(() => {cb.run() ; started.run()})) start(started)
...
Рейтинг: 0 / 0
Scala
    #39454622
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВДиезScala имеет более строгую типизацию, чем Java, C# или Typescript.
Scala имеет более мощную систему типов, чем Java, C#. Typescript - немного в стороне, хотя в C# есть dynamic...

Не вижу противоречий. Если вы дадите формальное определение понятий "сила типизации" и "мощность системы типов" - можно будет подискутировать.

ЕвгенийВТо, что показано в примере - примеси, на C# легко реализуются с помощью интерфейсов и методов расширения, которые там появились 100500 лет назад.
В 7,0 появился pattern matching, но он сильно уступает scala и f#.

Примеси - это не так интересно. Автор поста специально сделал сделал акцент на концепции path-dependent types.
...
Рейтинг: 0 / 0
Scala
    #39454919
private
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВся научная разработка компании huawei идет на scala
Из того что уже написано и работает на Scala - можно отметить фреймвоки Akka и Kafka.

Все это классно, но можно привести много примеров где компания Х успешно использует технологию Y. Это хороший дополнительный бонус, но он не демонстрирует преимушества языка в наглядном виде.

авторИдея в том, что многие потенциальные ошибки в скале можно отличить уже на этапе компиляции

Опять абстрактные утверждения. Про тот код с обсервером - он относится не к категории "многие" а к "редкие". Сказать что скала позволяет отследить потенциальные ошибки в каких-то редких случаях - да, судя по тому примеру можно так сказать. Но вот что "многие ошибки" пока такого примера не было.

авторScala имеет более строгую типизацию

Опять абстрактные утверждения.

авторScala имеет более мощную систему типов, чем Java, C#. Typescript - немного в стороне, хотя в C# есть dynamic...

Опять абстрактные утверждения.
...
Рейтинг: 0 / 0
25 сообщений из 94, страница 3 из 4
Форумы / Java [игнор отключен] [закрыт для гостей] / Scala
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]