Эффективность использования только функциональной парадигмы в Scala

Недавно я купил Programming Scala и прочитал его. Язык определенно не то, что я ожидал! В частности, кажется, что он реализует почти все идеи языка программирования, о которых я знаю, за исключением макросов Lisp и разделения побочных эффектов на уровне типов Haskell.

Честно говоря, это меня несколько ошеломило. Хотя я полагаю, что хорошо иметь в своем распоряжении так много инструментов, на самом деле я просто искал строго типизированный функциональный язык для JVM. Я полагаю, что мог бы использовать Scala таким образом, но я полагаю, что если я буду взаимодействовать с какими-либо библиотеками или просматривать чей-либо код, я столкнусь со многими этими продвинутыми (для меня) объектами ООП - чертами и "иерархией объектов". линеаризация», весь этот абстрактный и переопределяющий бизнес, одноэлементные, пакетные и сопутствующие объекты, неявные преобразования... не говоря уже о различных синтаксических сокращениях и сахарах.

Люди часто жалуются на программистов, которые пытаются впихнуть стиль одного языка в другой по множеству веских причин. Но не все языки столь же мультипарадигмальны, как Scala, так что, возможно, у его сообщества другое мнение? В F#, например, кажется, есть некоторая свобода действий в стилях программирования и в том, сколько ООП вы используете. Но просто из прочитанного я не уверен, что это хорошая философия и для Scala.

Могут ли мне помочь более опытные программисты на Scala? Отредактируйте для ясности. В принципе, могу ли я безопасно использовать только (или в основном) функции FP Scala, не беспокоясь о его расширенной стороне ООП?

Извините за сумбурный вопрос!


person J Cooper    schedule 22.11.2010    source источник
comment
Вы можете найти это полезным (хотя это не 100% ответ на ваш вопрос): stackoverflow.com/questions/1722726/   -  person Jeremy Powell    schedule 22.11.2010
comment
Я думаю, что это произойдет, как и с C++, когда люди просто выбирают подмножество языка и придерживаются его.   -  person OscarRyz    schedule 22.11.2010
comment
@ J Cooper - я не хочу быть противным или злым, но, во всяком случае, мне трудно сказать, о чем вы спрашиваете. Может быть, вы хотите воспользоваться моментом, чтобы отредактировать свой вопрос, чтобы сделать его более очевидным, что вы на самом деле спрашиваете?   -  person Onorio Catenacci    schedule 24.11.2010


Ответы (4)


Одна из вещей, которую вы видите, это то, что Scala — это, прежде всего, строго типизированный функциональный язык на JVM.

Scala — это не просто функциональный язык. Он начинался как один (Воронка: http://lamp.epfl.ch/funnel/ ), но затем он был расширен, чтобы сделать его объектно-ориентированным языком с явной целью сделать его строго совместимым с классами Java.

абстракция, переопределение и пакеты — все это примеры взаимодействия в действии.


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

черты и линеаризация иерархии объектов

Удаляет ограничение, согласно которому интерфейсы Java могут содержать только абстрактные методы. Линеаризация — это то, как Scala решает проблемы наследования алмазов, которые в противном случае могли бы возникнуть.

одиночки

Статические методы Java являются наследием синтаксиса C++, который, в свою очередь, добавил их для лучшей поддержки процедурного стиля, необходимого для взаимодействия с C. Статические методы в значительной степени НЕ объектно-ориентированы (см. этот вопрос: Почему одноэлементные объекты более объектно-ориентированы?)

сопутствующие объекты

Разрешить использование синглетонов вместо статических методов с их привилегированными правами доступа.

неявные конверсии

Java уже делает это, но ограничивается только неявным преобразованием объектов и примитивов в строки, как в выражении "" + 3. Scala просто расширяет эту идею и позволяет программисту использовать ее для других преобразований.

person Kevin Wright    schedule 22.11.2010
comment
Я думаю, что имплициты — это нечто большее, чем преобразования; есть также неявные параметры, которые вместе с системой типов scala позволяют таким библиотекам, как scalaz, делать так много классных и функциональных вещей. - person oxbow_lakes; 23.11.2010
comment
О, безусловно, имплицитов гораздо больше. Я просто обращался к конкретному упоминанию неявных конверсий в исходном вопросе :) - person Kevin Wright; 23.11.2010
comment
Я был придирчив - я прекрасно знаю, что вы знаете об этом :-) - person oxbow_lakes; 23.11.2010
comment
Имеет смысл. Значит, эти вещи в основном используются для взаимодействия с Java? - person J Cooper; 24.11.2010
comment
Вовсе нет, объекты являются гражданами первого класса в стране Scala. Однако на точную форму ориентации Scala на возражения сильно повлиял дизайн базовой платформы JVM и необходимость взаимодействия с Java. - person Kevin Wright; 24.11.2010

Позвольте мне добавить несколько комментариев к ответу Кевина.

Трейты в основном используются как абстракции (грубо говоря, так же, как классы типов Haskell определяют абстракции) и миксины. Итак, мой код может использовать трейт Map, но на самом деле он использует экземпляр типа HashMap. И наоборот, если я хочу, чтобы мой тип «Сервис» имел функциональность ведения журнала, я мог бы смешать многоразовую черту ведения журнала.

К счастью, вам редко приходится думать об алгоритме линеаризации, кроме простых случаев, например, я могу добавить трейт, который перехватывает (обертывает) вызов метода, чтобы регистрировать факт вызова метода. Алгоритм должен обрабатывать более сложные случаи линеаризации (например, примеры, которые мы показываем в книге), но на самом деле такие сложные типы — плохой дизайн, ИМХО.

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

Неявные преобразования очень полезны, хотя и немного «волшебные». Возможно, вам будет полезно посмотреть, как они используются для имитации классов типов Haskell. Вот отличный пост Дебасиша Гоша: http://debasishg.blogspot.com/2010/06/scala-implicits-type-classes-here-i.html

person Dean Wampler    schedule 22.11.2010
comment
Я думаю, что ваша книга прекрасно объяснила эти концепции; В основном мне было любопытно, в какой степени я буду взаимодействовать с ними, придерживаясь чисто функционального стиля, если это возможно. Ссылка была довольно интересной :) - person J Cooper; 24.11.2010

Хотя я начал программировать на scala, я определенно не более опытный член сообщества scala. Но я долго работал с другим языком - python, с которым аналогичная ситуация в меньшей степени. Он поддерживает процедурный, объектно-ориентированный и функциональный стили. Я обнаружил, что хотя некоторые люди склонны придерживаться одной крайности, многие комбинируют конструкции из разных стилей. Таким образом, идиоматический python будет состоять из интенсивного использования списков, функций первого класса, более высокого порядка и частичных функций, даже если данные, с которыми работают эти функции, являются объектами. Однако следует отметить, что с годами наблюдается тенденция к небольшому сдвигу в сторону функциональности.

Я думаю, учитывая инклюзивность стилей, которые поддерживает scala, вполне вероятно, что не будет единственно правильного способа решить проблему. Но я не удивлюсь, увидев, что большая часть программистов постепенно склоняется к стилю, который разумно использует и то, и другое, даже если они остаются терпимыми к программистам, желающим придерживаться одной из крайностей.

person Dhananjay Nene    schedule 22.11.2010
comment
Значит, вы думаете, что эти предпочтения/стили еще не полностью сформировались? - person J Cooper; 24.11.2010

person    schedule
comment
Согласитесь, вопрос имеет большое значение. Учитывая количество людей, которые в настоящее время утверждают, что Java проста, а Scala сложна, потому что это не Java, я нахожу освежающим взгляд на другую точку зрения. В частности, Scala сложна, потому что она наследует это сложное объектно-ориентированное наследие от Java. - person Kevin Wright; 23.11.2010
comment
Я думаю, что этот ответ ближе всего к тому, о чем я особенно беспокоился, хотя, конечно, другие ответы были информативными и ценными. - person J Cooper; 24.11.2010
comment
И я даже упустил самую важную недостающую функциональную часть! - person oxbow_lakes; 24.11.2010