Что хорошего в Скале?
Что делает Scala таким замечательным языком, кроме системы типов? Почти все, что я читаю о языке, выявляет "строгую типизацию" как серьезную причину использования Scala, но должно быть нечто большее. Какие еще интересные и / или классные языковые функции делают Scala действительно полезным инструментом?
14 ответов
Вот некоторые вещи, которые заставили меня отдать предпочтение Scala (скажем, по обычной Java):
а) Вывод типа. Java способ сделать это:
Map<Something, List<SomethingElse>> list = new HashMap<Something, List<SomethingElse>>()
... довольно многословен по сравнению со Scala. Компилятор должен быть в состоянии понять это, если вы дадите один из этих списков.
б) функции первого порядка. Опять же, эту функциональность можно эмулировать с классами, но это некрасиво.
в) коллекции, которые имеют map
а также fold
, Эти два связаны с (б), а также эти два - то, что я хочу каждый раз, когда мне приходится писать на Java.
г) сопоставление с образцом и тематические классы.
д) отклонения, которые означают, что если S extends T
, затем List[S] extends List[T]
также.
Прибавьте еще и статичность, и я довольно быстро продался на этом языке.
Это смесь лучших кусочков из множества языков, что не нравится:
- Краткий синтаксис руби
- Производительность Java
- Эрланг Актер Поддержка
- Колпачки / Блоки
- Удобная стенография для карт и массивов
Scala часто выставляют напоказ за то, что у него есть замыкания и последствия. Не удивительно, ведь отсутствие замыканий и явная типизация являются, пожалуй, двумя крупнейшими источниками Java-шаблона!
Но как только вы изучите его немного глубже, он выйдет далеко за рамки Java-без раздражающих битов. Возможно, самой сильной стороной Scala является не одна конкретная именованная функция, а то, насколько успешно она объединяет все функции, упомянутые в других ответах.,
Почтовый функционал
Например, объединение объектной ориентации и функционального программирования: поскольку функции являются объектами, Scala смогла заставить Maps реализовать интерфейс Function, поэтому при использовании карты для поиска значения она не отличается синтаксически от использования функции для вычисления значение. Хорошо объединяя эти парадигмы, Scala действительно является постфункциональным языком.
Или перегрузка операторов, которая достигается за счет отсутствия операторов, это просто методы, используемые в инфиксной нотации. Так 1 + 2
просто зовет +
метод на целое число. Если метод был назван plus
вместо этого вы бы использовали его как 1 plus 2
который ничем не отличается от 1.plus(2)
, Это стало возможным благодаря другой комбинации функций; в Scala все является объектом, примитивов нет, поэтому целые числа могут иметь методы.
Другая особенность Fusion
Также упоминались классы типов, достигаемые сочетанием типов с более высоким родом, одноэлементных объектов и последствий.
Другие функции, которые хорошо работают вместе, - это классы дел и сопоставление с образцом, позволяющие легко создавать и деконструировать алгебраические типы данных без необходимости вручную писать всю утомительную логику равенства, хэш-кода, конструктора и метода получения / установки, которую требует Java.
Задание неизменяемости по умолчанию, предлагая ленивые значения и функции первого класса - все это в совокупности дает вам язык, который очень подходит для построения эффективных функциональных структур данных.
Этот список можно продолжить, но я использую Scala уже более 3 лет, и я до сих пор почти каждый день удивляюсь тому, насколько хорошо все работает вместе.
Эффективный и универсальный
Scala также является небольшим языком со спецификацией, которая (на удивление!) Должна составлять примерно 1/3 размера Java. Отчасти это связано с тем, что в спецификации Java есть множество особых случаев, которые упрощает Scala, отчасти из-за удаления таких функций, как примитивы и операторы, а отчасти из-за того, что большая часть функциональности была перенесена из языка в библиотеки.
Как преимущество этого, все методы, доступные авторам библиотеки Scala, также доступны любому пользователю Scala, что делает его отличным языком для определения ваших собственных конструкций потока управления и для создания DSL. Это было очень полезно в таких проектах, как Akka - сторонний фреймворк Actor.
глубоко
Наконец, он масштабирует весь спектр стилей программирования.
Интерпретатор времени выполнения (известный как REPL) позволяет очень быстро исследовать идеи в интерактивном сеансе, а файлы Scala также можно запускать как скрипты без необходимости явной компиляции. В сочетании с выводом типов это дает Scala ощущение динамического языка, такого как Ruby, Perl или сценария bash.
На другом конце спектра черты, классы, объекты и собственные типы позволяют построить полномасштабную корпоративную систему, основанную на отдельных компонентах и использующую внедрение зависимостей, без необходимости использования сторонних инструментов. Scala также интегрируется с библиотеками Java на уровне, практически равном естественному для Java, и, работая на JVM, может воспользоваться всеми преимуществами скорости, предлагаемыми на этой платформе, а также идеально использоваться в таких контейнерах, как tomcat или OSGi.
Я новичок в Scala, но у меня сложилось впечатление:
Действительно хорошая интеграция JVM будет движущим фактором. JRuby может вызывать java, а java может вызывать код JRuby, но он явно вызывает другой язык, а не чистую интеграцию Scala-Java. Таким образом, вы можете использовать библиотеки Java и даже смешивать и сочетать в одном проекте.
Я начал смотреть на scala, когда осознал, что то, что приведет в движение следующий великий язык, - это простой параллелизм. JVM имеет хороший параллелизм с точки зрения производительности. Я уверен, что кто-то скажет, что Erlang лучше, но Scala на самом деле используется обычными программистами.
Ява падает на то, что это так болезненно многословно. Для создания и передачи функтора требуется слишком много символов. Scala позволяет передавать функции в качестве аргументов.
В Java невозможно создать тип объединения или применить интерфейс к существующему классу. Это оба легко в Scala.
Статическая типизация обычно имеет большой штраф за многословность. Scala устраняет этот недостаток, в то же время давая преимущество статической типизации, которая является проверкой типов во время компиляции, и облегчает работу с кодом в редакторах.
Возможность расширить язык. Это то, что поддерживало работу Lisp на протяжении десятилетий, и это позволило Ruby on Rails.
Система типов действительно является самой отличительной чертой Scala. Он также имеет много синтаксических удобств, скажем, над Java.
Но для меня наиболее убедительными особенностями Scala являются:
- Первоклассные модули.
- Типы высшего рода (полиморфизм конструкторов типов).
- Последствия.
По сути, эти функции позволяют вам приближать (и в некоторых отношениях превосходить) классы типов Haskell. В совокупности они позволяют писать исключительно модульный код.
Просто коротко:
- Вы получаете мощь и независимость от платформы библиотек Java, но без шаблонного и многословного.
- Вы получаете простоту и производительность Ruby, но со статической типизацией и скомпилированным байт-кодом.
- Вы получаете функциональные преимущества и поддержку параллелизма в Haskell, но без полного изменения парадигмы и преимуществ объектной ориентации.
Что я нахожу особенно привлекательным во всех его великолепных чертах, среди прочего:
- Большинство объектно-ориентированных шаблонов проектирования, которые требуют загрузки стандартного кода в Java, поддерживаются изначально, например, Singleton (через объекты), Adapter, Decorator (через черты и имплициты), Visitor (через сопоставление с образцом), Strategy (через замыкания) и т. Д.,
- Вы можете определить свои доменные модели и DSL очень кратко, а затем расширить их с помощью необходимых функций (уведомление, обработка ассоциаций; анализ, сериализация), без необходимости генерации кода или структур.
- И, наконец, полная совместимость с хорошо поддерживаемой платформой Java. Вы можете смешивать Java и Scala в обоих направлениях. При переходе на Scala не возникает особых проблем и проблем с совместимостью после того, как Java испытывает раздражение, из-за которого трудно поддерживать код.
Выразительность управления потоком. Например, очень часто есть набор данных, которые вам нужно каким-то образом обрабатывать. Это может быть список сделок, в которых обработка включает группировку по некоторым свойствам (валютам инвестиционных инструментов) и затем суммирование (возможно, для получения итогов по каждой валюте).
В Java это включает в себя выделение фрагмента кода для группировки (несколько строк цикла for), а затем еще одного фрагмента кода для суммирования (еще один цикл for). В Scala такого рода вещи обычно достижимы в одной строке кода, используя функциональное программирование и затем сворачивание, которое очень выразительно читает l-to-r.
Конечно, это всего лишь аргумент в пользу функционального языка поверх Java.
Замечательные особенности Scala уже упоминались. Одна вещь, которая просвечивает сквозь все функции, это то, как со вкусом все интегрировано.
Scala удается стать одним из самых мощных языков, не чувствуя при этом спешки. Язык также не является академическим упражнением в доказательстве своей позиции. Инновации и действительно передовые концепции привносятся в язык со странной практичностью и элегантностью.
Короче говоря: Мартин Одерски - гений чистого дизайна. Вот что так здорово в Скале!
Предположительно, очень легко заставить код Scala работать одновременно на нескольких процессорах.
Каждый день, когда вы пишете код Java, вы становитесь все более и более несчастным, каждый день, когда вы пишете код Scala, вы становитесь счастливее.
Я хочу добавить, что природа мультипарадигмы (OO и FP) дает Scala преимущество над другими языками
Если мы откажемся от обсуждения возможностей и поговорим о стиле, я бы сказал, что это конвейерный стиль кодирования. Вы начинаете с некоторого объекта или коллекции, вводите точку и свойство или точку и преобразование и делаете это до тех пор, пока не получите желаемый результат. Таким образом, легко написать цепочку преобразований, которые будут легко читать и их. Черты в некоторой степени также позволят вам применять тот же подход к конструированию типов.
Вот несколько довольно глубоких объяснений привлекательности функциональных языков.
Как / почему функциональные языки (в частности, Erlang) хорошо масштабируются?