Что делает Scala такой замечательный язык, кроме системы типов? Почти все, что я читал о языке, выдает "сильную типизацию" как большую причину использования Scala, но должно быть больше. Каковы некоторые другие привлекательные и/или интересные языковые функции, которые делают Scala действительно полезным инструментом?
Что такого хорошего в Scala?
Ответ 1
Вот некоторые из вещей, которые заставили меня одобрить Scala (поверх, скажем, обычной Java):
a) Введите вывод. Способ Java:
Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
.. довольно многословно по сравнению с Scala. Компилятор должен уметь это выяснить, если вы дадите один из этих списков.
b) Функции первого порядка. Опять же, эту функциональность можно эмулировать с помощью классов, но это уродливо.
c) Коллекции, имеющие map
и fold
. Эти два связаны с (б), а также эти два - это то, что я желаю, каждый раз, когда я должен писать Java.
d) Соответствие шаблону и классы case.
e) Отклонения, которые означают, что если S extends T
, тогда List[S] extends List[T]
.
Бросьте также некоторые доброты статического типа, и я был довольно быстро продан на этом языке.
Ответ 2
Это засорение лучших бит из кучи языков, что не любить:
- Краткий синтаксис Ruby
- Производительность Java
- Поддержка исполнителей Erlang.
- Колпачки /Blocks
- Удобное сокращение для карт и массивов.
Ответ 3
Scala часто парашют за закрытие и импликацию. На самом деле это не удивительно, так как отсутствие замыканий и явное написание, возможно, являются двумя самыми большими источниками шаблона Java!
Но как только вы изучите его немного глубже, он выходит далеко за рамки Java-без-раздражающих бит. Возможно, самая большая сила Scala - это не одна конкретная именованная функция, но насколько она успешна в объединении всех функции, упомянутые в других ответах.
Post Functional
Объединение объектной ориентации и функционального программирования, например: поскольку функции являются объектами, Scala смог заставить Maps реализовать интерфейс Function, поэтому, когда вы используете карту для поиска значения, она не отличается синтаксически от использования функция для вычисления значения. Таким образом, унифицируя эти парадигмы, Scala действительно является пост-функциональным языком.
Или перегрузка оператора, которая достигается за счет отсутствия операторов, это просто методы, используемые в нотации infix. Поэтому 1 + 2
просто вызывает метод +
для целого числа. Если бы метод был назван plus
вместо этого, вы использовали бы его как 1 plus 2
, который ничем не отличается от 1.plus(2)
. Это стало возможным благодаря другой комбинации функций; все в Scala является объектом, нет примитивов, поэтому целые числа могут иметь методы.
Другие функции Fusion
Также упоминались классы типов, достигаемые комбинацией более высоких типов, одноэлементных объектов и имплицитов.
Другие функции, которые хорошо сочетаются, - это классы классов и шаблоны, позволяющие легко создавать и деконструировать алгебраические типы данных, без необходимости вручную записывать все требуемые требования Java, конструктор и геттер/сеттер, требующие Java.
Указание неизменяемости по умолчанию, предложение ленивых значений и предоставление функций первого класса в совокупности дают вам язык, который очень подходит для построения эффективных функциональных структур данных.
Список продолжается, но я использую Scala уже более 3 лет, и я по-прежнему удивляюсь почти ежедневно, насколько хорошо все работает вместе.
Эффективный и универсальный
Scala также является небольшим языком со спецификацией, которая (удивительно!) должна составлять примерно 1/3 от размера Java. Частично это объясняется тем, что в спецификации Java есть много особых случаев: Scala упрощается, частично из-за удаления таких функций, как примитивы и операторы, а отчасти из-за того, что многие функции были перемещены с языка и в библиотеки.
В пользу этого все методы, доступные для авторов библиотеки Scala, также доступны для любого пользователя Scala, что делает его отличным языком для определения ваших собственных конструкций потока управления и для создания DSL. Это было отлично использовано в таких проектах, как Akka - сторонняя структура Actor.
Deep
Наконец, он масштабирует весь диапазон стилей программирования.
Интерпретатор времени выполнения (известный как REPL) позволяет очень быстро исследовать идеи в интерактивном сеансе, а файлы Scala также могут выполняться как скрипты без необходимости явной компиляции. В сочетании с выводами типа это дает Scala ощущение динамического языка, такого как Ruby, Perl или bash script.
На другом конце спектра черты, классы, объекты и типы типов позволяют создавать полномасштабную корпоративную систему на основе отдельных компонентов и использовать инъекцию зависимостей без необходимости использования сторонних инструментов. Scala также интегрируется с библиотеками Java на уровне, почти совпадающем с собственной Java, и, запуская JVM, может воспользоваться всеми преимуществами скорости, предлагаемыми на этой платформе, а также прекрасно использоваться в контейнерах, таких как tomcat, или с OSGi.
Ответ 4
Я новичок в Scala, но мое впечатление:
Действительно хорошая интеграция с JVM станет движущей силой. JRuby может вызывать java, а java может вызывать код JRuby, но он явно вызывает другой язык, а не чистую интеграцию Scala -Java. Таким образом, вы можете использовать библиотеки Java и даже смешивать и сопоставлять в одном проекте.
Я начал смотреть на scala, когда понял, что вещь, которая будет управлять следующим отличным языком, проста concurrency. JVM имеет хороший concurrency с точки зрения производительности. Я уверен, что кто-то скажет, что Эрланг лучше, но scala на самом деле может использоваться обычными программистами.
Там, где Java падает, это просто так больно многословно. Для создания и передачи Functor требуется слишком много символов. scala позволяет передавать функции в качестве аргументов.
В Java невозможно создать тип объединения или применить интерфейс к существующему классу. Это легко сделать в Scala.
Статическая типизация обычно имеет большой штраф за вербальность. scala устраняет этот недостаток, сохраняя при этом статическую типизацию, которая проверяет тип времени компиляции, и облегчает облегчение кода в редакторах.
Возможность расширения языка. Это то, что хранило Lisp в течение десятилетий, и это позволило Ruby on Rails.
Ответ 5
Система типов действительно Scala наиболее отличительная особенность. Он также имеет много синтаксических удобств, например, Java.
Но для меня наиболее неотразимыми особенностями Scala являются:
- Первоклассные модули.
- Более высокие типы (тип полиморфизма конструктора).
- Implicits.
По сути, эти функции позволяют приблизиться (и в некотором роде превзойти) классы классов Haskell . Комбинированные, они позволяют вам писать исключительно модульный код.
Ответ 6
Просто коротко:
- Вы получаете мощность и независимость платформы от библиотек Java, но без шаблона и многословия.
- Вы получаете простоту и производительность Ruby, но со статическим набором и скомпилированным байт-кодом.
- Вы получаете функциональные блага и поддержку Haskell, но без полного смещения парадигмы и преимуществ объектной ориентации.
То, что я нахожу особенно привлекательным во всех его великолепных особенностях, среди прочих:
- Большинство объектно-ориентированных шаблонов проектирования, которые требуют загрузки кода шаблона в Java, поддерживаются изначально, например. Синглтон (через объекты), Адаптер, Декоратор (через черты и имплициты), Посетитель (через сопоставление с образцом), Стратегия (через закрытие) и т.д.
- Вы можете определить свои модели домена и DSL очень кратко, затем вы можете расширить их с помощью необходимых функций (уведомление, обработка ассоциаций, разбор, сериализация), без необходимости генерации кода или фреймворков.
- И, наконец, полная совместимость с хорошо поддерживаемой платформой Java. Вы можете смешивать Java и Scala в обоих направлениях. При переключении на Scala при работе с ошибками Java не слишком много штрафов или проблем с совместимостью, что затрудняет работу с кодом.
Ответ 7
Ответ 8
Предположительно очень легко выполнить Scala код одновременно на нескольких процессорах.
Ответ 9
Выраженность управляющего потока. Например, очень часто существует набор данных, которые вам нужно каким-то образом обрабатывать. Это может быть список сделок, в которых обработка включает в себя группирование по некоторым свойствам (валюты инвестиционных инструментов), а затем выполнение суммирования (возможно, для получения итогов за валюту).
В Java это включает выделение фрагмента кода для группировки (несколько строк для цикла), а затем еще один фрагмент кода для суммирования (другой для цикла). В Scala этот тип вещей обычно реализуется в одной строке кода с использованием функционального программирования, а затем складывается, что очень ярко выражается l-to-r.
Конечно, это просто аргумент для функционального языка над Java.
Ответ 10
Основные особенности Scala уже упомянуты. Одна вещь, которая сияет сквозь все прошлые функции, заключается в том, насколько со вкусом все интегрировано.
Scala умудряется быть одним из самых мощных языков вокруг, не чувствуя при этом опережения. Ни один из языков не является академическим упражнением, доказывающим точку. Инновации и действительно продвинутые концепции приводятся на язык с необычной практичностью и элегантностью.
Короче говоря, Мартин Одерский - гениальный дизайн. Это так здорово в отношении Scala!
Ответ 11
Я хочу добавить природу мультипарадигмы (OO и FP), которая дает Scala ребро над другими языками
Ответ 12
Каждый день, когда вы кодируете Java, вы становитесь все более и более несчастным, каждый день вы код Scala, вы станете счастливее.
Ответ 13
Вот несколько достаточно подробных объяснений для обращения к функциональным языкам.
Как/почему хорошо функционируют функциональные языки (в частности, Erlang)?
Ответ 14
Если мы откажемся от обсуждения функций и поговорим о стиле, я бы сказал, что это стиль линии кодирования. Вы начинаете с какого-либо объекта или коллекции, типа dot и свойства или точки и трансформации и делаете это, пока не сформируете желаемый результат. Таким образом, легко написать цепочку преобразований, которая будет легко читать их также. Черты в некоторой степени также позволят вам применить тот же подход к построению типов.