LINUX.ORG.RU

Релиз Scala 3.0

 


0

3

После 8 лет работы, 28000 коммитов, 7400 пулл-реквестов и 4100 закрытых вопросов Scala 3 наконец-то вышла. С момента первого коммита 6 декабря 2012 года более ста человек внесли свой вклад в проект. Сегодня Scala 3 включает в себя последние исследования в области теории типов, а также промышленный опыт использования Scala 2. Основываясь на этом опыте, разработчики создали третью версию языка, простую в использовании, изучении и масштабировании.

В Scala 3 появилось много новых функций, и вы можете задаться вопросом, с чего начать изучать всё это? Основным местом для изучения Scala 3 является документация. Одна вещь полностью изменилась в Scala 3 по сравнению с Scala 2: это макросы. Здесь вы можете узнать больше о том, как они работают в Scala 3.

Для опытных разработчиков, желающих ускорить переезд на новую версию языка программирования, подготовлено отдельное руководство.

>>> Список нововведений

>>> Подробности

★★★★★

Проверено: xaizek ()
Последнее исправление: xaizek (всего исправлений: 2)

Ответ на: комментарий от BattleCoder

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

anonymous
()
Ответ на: комментарий от BattleCoder

Ну ты давай, жри дальше кактусы пока тебе какой-то клоун из EPFL будет завозить имплиситы десятого порядка и 50-проходный компилятор, которого ты будешь ждать пока не состаришься, ковыряясь в sbt.

Нормальные мужики в это время будут использовать православные классы типов, радоваться быстрой компиляции и вменяемой системой сборки stack.

anonymous
()

Как макросы? Годны? Поскольку я теперь опять проф.лиспер, думаю, не пуститься ли во все тяжкие и не впилить ли макросы в Активный Оберон. Всё равно орловские оберонщики это уже собрались сделать для случая блекбокса, поэтому я почти не обгоню всемирное зло, а уж во всяких растах и иже с ними макросы уже давно есть.

den73 ★★★★★
()
Ответ на: комментарий от anonymous

Да вроде же в движке ЛОРа есть Скала.

den73 ★★★★★
()
Ответ на: комментарий от anonymous

Да вроде на ней писали в банке Тиньков миллионы оперденей. Хотя, возможно, это просто кто-то круто развёл банкирских капиталистов.

den73 ★★★★★
()

Чем оно лучше паскаля?

anonymous
()

Наконец-то почистили всякую фигню типо xml-литералов, добавили intersection and union types добавили, которые могли быть в scala 2, но всё равно вместо стройного, логичного и мощного языка получился overengineered.

anonymous
()
Ответ на: комментарий от Legioner
  1. Исходники коллекций полезно читать для общего развития. Для работы нужно понимание как они работают. Для этого лучше прочитать доку. Спойлер: во всех функциональных языках они работают одинаково.
  2. scalaz мертва уже года 4. На смену пришел cats. Вокруг него уже есть экосистема, а с приходом Scala 3 так вообще огонь будет
anonymous
()
Ответ на: комментарий от allter149

Их не просто переименовали, но и анонимизировали. Теперь не будет проблем с пересекающимися именами. И ошибки компиляции подрихтовали, но то давно уже

anonymous
()
Ответ на: комментарий от anonymous

Их не просто переименовали, но и анонимизировали. Теперь не будет проблем с пересекающимися именами. И ошибки компиляции подрихтовали, но то давно уже

Но пользоваться будут все равно котлином или просто джавой. Даже питон не вполне пережил переход со 2й версии на 3ю, а тут язык куда менее популярный пошел по тому же пути.

anonymous
()
Ответ на: комментарий от anonymous

История Перла и Питона поучительна. В Скале 3 вот что сделали:

  • предусмотрели постепенную миграцию.
  • уже лет 6 есть scalafix, который помогал c простыми вещами между 2.11, 2.12, 2.13. Ломать не в новинку.
  • tutorial для сложных вещей типа макросов
  • некоторые критичные библиотеки и тулы портировали под Scala 3 еще на этапе бэты, sbt, scalatest, scalacheck. Cats уже зарелизили под тройку. Akka пока отстает.

Итого, нужно переписать макросы, которые чаще всего встречаются в фреймворках. Ну и какую-то дичь, как в Спарке с неправильной архитектурой.

Переход сулит много плюшек - ускорится компиляция, и не нужно перекомпилироваться под каждую версию Скалы. Это сам по себе ОГРОМНЫЙ стимул перейти на новую версию. Ну и язык проще стал. implicit разделил на три части. Все ждали тройку еще 4 года назад.

Котлином по итогу будут пользоваться те, кого задолбала джава. Ну а если хочешь ФП - большинство вакансий в Скале, как и раньше. Arrow-kt страшный как атомная война, а на Хаскеле вакансий мало.

anonymous
()
Ответ на: комментарий от anonymous

Ну а если хочешь ФП - большинство вакансий в Скале, как и раньше.

Большинство - это все три с половиной?

anonymous
()
Ответ на: комментарий от anonymous

Большинство - это все три с половиной?

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

anonymous
()
Ответ на: комментарий от devorg

а скала ещё актуальна после появления и массового распространения котлина?

Интересно понять, отчего она так быстро загнила. Вроде как это случилось еще до того, как котлин стал популярен.

anonymous
()
Ответ на: рейтинг популярности от devorg

Небось какой-то автоматический парсер. В духе «проект собирается gradle, значит 100 очков грифиндору^W groovy».

anonymous
()
Ответ на: комментарий от swar0g

а мне кто-нибудь может толково объяснить, чем оно лучше, чем haskell?

Наверно решающий фактор - взаимодействие с джавой (джава - стандарт в энтерпрайзе, а в хаскеле на несколько порядков меньше либ и разработчиков).

anonymous
()
Ответ на: комментарий от swar0g

Ничем, кроме JVM и интеропа со всем JVM-овским.

Сам язык, как упоминалось выше довольно мерзостен, система сборки и документация отвратительна. Чего после появления stack не сказать о божественном Хаскеле.

Кстати, котаны, как там Frege поживает - самозакопался уже или что-то теплится? В репе комиты пары дней давности, а не слышно о нем от слова «ничего».

anonymous
()
Ответ на: комментарий от anonymous

Чего после появления stack не сказать о божественном Хаскеле.

Наверно это потому что на нем никто толком не пишет. Те немногие, кто пишет, вполне могут свои потребности покрыть в кодинге и качестве документации, но широкие массы этим не прокормишь. Лишь немногим интересны эзотерические этюды «смотри, как я могу».

anonymous
()
Ответ на: комментарий от anonymous

Можно взять ряд продуктов и подумать, а где здесь мог пригодиться хаскель:

форум типа этого, банковский биллинг, видеоконференция, код для полета в космос, майнинг крипты, ядро операционки, опрос датчиков для микроконтроллера, мобильный клиент для соцсети, СУБД, 3d-игрушка, браузер, IDE.

Что из этого можно написать уже сегодня? Или там еще 10 лет надо ножи точить и телегу запрягать?

anonymous
()
Ответ на: комментарий от anonymous

Ну может Снойман до старости изобретет еще все библиотеки. Все же думали, что жопа с cabal навсегда, а потом опа! и жизнь появилась.

А вообще жалко, что нет ORM-а типа Джанговского, а есть только несколько уныловатый persistent из yesod’а. К этому бы еще генератор когда из Swagger-а подключить и был бы огонь на servant’е API для веб-дерьма писать. Тут точно Хаскель за 5 минут мир бы завоевал…

anonymous
()
Ответ на: комментарий от anonymous

Тут точно Хаскель за 5 минут мир бы завоевал…

Только в фантазиях фанатов.

anonymous
()
Ответ на: комментарий от swar0g

За Скалу деньги платят. Если вам платят за Хаскель - ничем.

anonymous
()

Весь хаскелосрач читать лень, так что сорри если наброшу неоригинально: чистое ФП (с монадным IO) на императивном железе – это «paradigm mismatch» (есть такое матерное слово) как частный случай дырявой абстракции.

(Другие примеры paradigm mismatch: rich ORM; stateful web frameworks; было что-то ещё, но не помню.)

Хз что там с хаскелем; наверное, за счёт компилируемости у него хотя бы с эффективностью всё ок – насколько это вообще возможно в чистом ФП. Но лично я, помнится, вкурил идею монадного IO на этой странице доков скаловского (что в тему) фреймворка ZIO. И идея эта, имею заявить, гнилая насквозь: «program as value» – это AST: фактически строится AST на интерпретируемом языке, затем вызывается его корневой узел. Чтобы вы, @#$ть, могли выполнять программу, пока выполняете программу (почти (c)). Т.е. аж целый дополнительный язык ввели, чтобы замаскировать естественную и неизбежную императивность операций ввода-вывода под якобы-иммутабельность. А то, что сама программа на интерпретируемом языке иммутабельна – нифига не достижение: обычная императивная программа в ELF-файле и в его образе в памяти тоже, знаете ли, как правило иммутабельна.

dimgel ★★★★★
()
Ответ на: комментарий от devorg

Это две параллельные реальности. Скала была так и остается полем экспериментов для jvm языков, откуда потом появляются новые фичи. Котлин - бэттер джава.

anonymous
()
Ответ на: комментарий от anonymous

Гдеж она загнила. Растёт, линейно, но растёт

anonymous
()
Ответ на: комментарий от dimgel

Дык, Lisp чистой воды, program as value. Всё верно, since 1959. И всё верно про императивное железо, другого пока не завезли.

Иммутабельность нужна не в файле, а на этапе разработки. Что бы компилятор проверил наличие ошибок. С таким подходом рефакторить намного легче. В байткоде понятия иммутабельности уже нет.

в памяти тоже, знаете ли, как правило иммутабельна.

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

anonymous
()
Ответ на: комментарий от dimgel

Весь хаскелосрач читать лень, так что сорри если наброшу неоригинально

Наброс и правда на троечку - в пределе производительность вообще не важна, если только абстракции не имеют экспоненциальной стоимости.

Поэтому рассуждения о paradigm mismatch, это все разговоры в пользу бедных, которым приходится сегодня на всяких фортранах какое-то HPC считать, которое через 15 лет они на холодильнике вычислить смогут. Ну и хер с ними, пусть считают - мамы всякие нужны (с)

Остальным будет счастье, если они смогут функционально писать с монадным IO, а что там под капотом их типы, которые они линзами читают в JSON сериализуют древние египтяне, которые для этого блоки веревками тащат, для всякой там вебни и межсистемных взаимодействий не имеет никакого значения…

anonymous
()
Ответ на: комментарий от anonymous

Мне в день больше рекрутеров пишут с предложением по Скале

anonymous
()
Ответ на: комментарий от anonymous

Заменить слово «Scala» на «Java», и всё верно будет

anonymous
()
Ответ на: комментарий от anonymous

Иммутабельность нужна не в файле, а на этапе разработки. Что бы компилятор проверил наличие ошибок. С таким подходом рефакторить намного легче.

Ну звучит-то красиво и логично. Наверное, если привыкнуть себе мозги чисто-ФП-шно выворачивать, то кому-то так оно действительно удобно. Но мой скромный (примерно месяц) опыт секса с ZIO был совершенно тошнотворным; стал бы я иначе про дырявые абстракции вспоминать.

dimgel ★★★★★
()
Ответ на: комментарий от anonymous
Вкусы Царей отличались от вкуса народа, поэтому дичь его была по вкусу его.

коммерсы на hs умеют только под % выдавать чистые кредиты за неиспользование Добрых Советов

data PackageException
  = PackageInvalidCabalFile
      !(Either PackageIdentifierRevision (Path Abs File))
      !(Maybe Version)
      ![PError]
      ![PWarning]
  | MismatchedCabalIdentifier !PackageIdentifierRevision !PackageIdentifier
  deriving Typeable

Он был белокур, с красивыми глазами и приятным лицом.

let inline memoizeN (f:'``(T1 -> T2 -> ... -> Tn)``): '``(T1 -> T2 -> ... -> Tn)`` =
        let inline call_2 (a: ^MemoizeN, b: ^b) = ((^MemoizeN or ^b) : (static member MemoizeN : ^MemoizeN * 'b -> _ ) (a, b))
        call_2 (Unchecked.defaultof<MemoizeN>, Unchecked.defaultof<'``(T1 -> T2 -> ... -> Tn)``>) f
        
type AcMerge =
    inherit Default1
    static member ``+++`` (f: 'T1 -> 'U1   , g: 'T2 -> 'U2   , [<Optional>]_output:  Choice<'T2,'T1> ->  Choice<'U2,'U1> , [<Optional>]_mthd: AcMerge) = Fanin.Invoke (Choice2Of2 << f) (Choice1Of2 << g)                                       : Choice<'T2,'T1> ->  Choice<'U2,'U1>
    static member ``+++`` (f: Func<'T1,'U1>, g: Func<'T2,'U2>, [<Optional>]_output: Func<Choice<'T2,'T1>,Choice<'U2,'U1>>, [<Optional>]_mthd: AcMerge) = Fanin.Invoke (Func<_,_> (Choice2Of2 << f.Invoke)) (Func<_,_> (Choice1Of2 << g.Invoke)) : Func<Choice<'T2,'T1>,Choice<'U2,'U1>>

    static member inline Invoke (f: '``ArrowChoice<'T1,'U1>``) (g: '``ArrowChoice<'T2,'U2>``) : '``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>`` =
        let inline call (mthd: ^M, output: ^R) = ((^M or ^R) : (static member ``+++`` : _*_*_*_ -> _) f, g, output, mthd)
        call (Unchecked.defaultof<AcMerge>, Unchecked.defaultof<'``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>``>)

    static member inline InvokeOnInstance (f: '``ArrowChoice<'T1,'U1>``) (g: '``ArrowChoice<'T2,'U2>``) : '``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>`` = (^``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>`` : (static member (+++) : _*_ -> _) f, g)

type AcMerge with
    static member inline ``+++`` (f: '``ArrowChoice<'T1,'U1>``, g: '``ArrowChoice<'T2,'U2>``, _output: '``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>``, _mthd: Default1) = AcMerge.InvokeOnInstance f g : '``ArrowChoice<Choice<'T2,'T1>,Choice<'U2,'U1>>``
    static member inline ``+++`` (_: '``ArrowChoice<'T1,'U1>``, _: '``ArrowChoice<'T2,'U2>``, _output: ^t when ^t : null and ^t : struct                , _mthd: Default1) = id

Они обладают самым лучшим приятным вкусом, какой только можно купить за Добрые 5€

anonymous
()
Ответ на: комментарий от anonymous

Кстати Эф-Шарпо-проблемы… Исходники Arrow на Haskell выглядят шокирующе НЕ дико:

instance Monad m => ArrowChoice (Kleisli m) where
    left f = f +++ arr id
    right f = arr id +++ f
    f +++ g = (f >>> arr Left) ||| (g >>> arr Right)
    Kleisli f ||| Kleisli g = Kleisli (either f g)

https://hackage.haskell.org/package/base-4.15.0.0/docs/src/Control-Arrow.html

anonymous
()
Ответ на: комментарий от tz4678

Почему вы не отвечаете мне на покупку видеокарты? Я что - членом у вас ложку изо рта выбил или еще чем обидел?

Владимир

anonymous
()
Ответ на: комментарий от anonymous

Про возможность задавать given/extension без указания имени и объявлять using аргументы анонимно читал - удобная фича. Но вроде, имя в итоге всё равно создаётся (If the name of a given is missing, the compiler will synthesize a name from the implemented type(s)), и его можно переопределить (?)

В любом случае, они ещё предусмотрели отличие импортов given от импортов обычных имён.

allter149
()
Ответ на: комментарий от anonymous

Arrow-kt страшный как атомная война, а на Хаскеле вакансий мало.

чем Arrow-kt страшен, можно пару примеров с пояснениями?

anonymous
()
Ответ на: комментарий от dimgel

Весь хаскелосрач читать лень, так что сорри если наброшу неоригинально: чистое ФП (с монадным IO) на императивном железе – это «paradigm mismatch» (есть такое матерное слово) как частный случай дырявой абстракции.

Держи классику: SSA is Functional Programming. Вся эта ваша императивщина сначала компилируется в нечто функциональное перед тем, как стать машинным кодом.
Вообще, дихотомия императивщина — функциональщина наивна, смысл имеют контроль эффектов и контроль ресурсов. И да, монадки это костыль, более кошерные решения это эффекты (как в Koka) и субструктурные (то есть линейные, аффинные, etc) типы.

quantum-troll ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.