Подтвердить что ты не робот

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

Я научился программированию на Java, а затем пытался изучать один язык программирования в год, второй - С++, затем Python. Пришло время узнать следующий, я искал что-то новое, я выбираю Scala, потому что он совместим с Java и может быть некоторым переходом от ООП к функциональному программированию.

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

Читая много статей, я столкнулся с этой статьей, критикующей Scala:

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

После прочтения этих статей мне пришло в голову несколько сомнений, мне очень нравится Scala и начал писать на Scala больше, но Scala подходит для определения функционального программирования? Эта статья говорит правду или просто подделывает читателей? Должен ли я изучать Haskell или какой-либо другой язык функционального программирования, чтобы действительно испытать FP?

ОБНОВЛЕНИЕ: ожидая рациональных ответов с хорошими примерами, не вызывая споров.

4b9b3361

Ответ 1

Scala не заставляет вас писать в функциональном стиле. Это совершенно верно Scala:

var i = 1
while (i < 10) {
  println("I like side effects, this is number "+i)
  i += 1
}
case class C(var i: Int, var set: Boolean = false)
def setMe(c: C) = { if (!c.set) { c.set = true; c.i += 1 }; c }
setMe(C(5))

Итак, в этом смысле, ужасы, Scala не работают! Побочные эффекты в изобилии, изменяемое состояние - все, что вы можете сделать на Java, вы можете сделать в Scala.

Тем не менее, Scala позволяет вам кодировать функциональный стиль и делает вашу жизнь проще (чем на Java) несколькими способами:

  • Существуют первоклассные функции
  • Существует библиотека неизменяемых коллекций
  • Рекурсия хвоста поддерживается (в той мере, в которой JVM может управлять)
  • Поддерживается соответствие шаблонов
  • (и т.д.).

Это выглядит несколько более функциональным:

for (i <- 1 to 10) println("Sometimes side effects are a necessary evil; this is number"+i)
case class C(i: Int, set: Boolean = false)
def setIt(c: C, f: Int=>Int) = C(f(c.i), true)
setIt(C(5), _+1)

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

def x(a: Int, b: Int) = a + b
def y = Function.curried(x _)(1)

Но это не так уж плохо, если обратить внимание на то, что вы делаете:

def x(a: Int)(b: Int) = a + b
val y = x(1) _

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

Ответ 2

Мой личный лакмусовый тест для функционального языка - это цифры в церкви.

Пример схемы:

(define (thrice f)
    (lambda (x)
        (f (f (f x))))))

((thrice 1+) 0)
  => 3

(1+ - это функция Схемы, которая добавляет 1 к ее аргументу. thrice принимает функцию f и возвращает функцию, которая составляет f с самим собой три раза. Таким образом, (thrice 1+) добавляет три к своему аргументу.)

((thrice (thrice 1+)) 0)
  => 9

(Так как (thrice 1+) - это функция, которая добавляет три, взяв thrice of, которая дает функцию, которая добавляет девять.)

И мой любимый:

(((thrice thrice) 1+) 0)
  => 27

(Рассуждение в качестве упражнения для читателя. Этот последний пример является самым важным.)

Если вы не можете написать этот пример на своем языке без ужасных искажений, то я говорю, что это не функциональный язык (пример: C/С++).

Если вы можете написать этот пример на своем языке, но он выглядит очень неестественно, тогда я говорю, что ваш язык "поддерживает функциональное программирование", но на самом деле не является функциональным языком (например, Perl).

Если этот пример аккуратно переносит ваш язык и на самом деле выглядит не так сильно, как вы используете его изо дня в день, тогда это функциональный язык.

Я не знаю Scala. Кто-нибудь хочет сказать мне, где он подходит?: -)

Ответ 3

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

Я не мог сказать ничего лучше и что все, что можно сказать, кроме бессмысленных аргументов.