Является ли Scala функциональным языком программирования?
Я научился программированию на Java, а затем пытался изучать один язык программирования в год, второй - С++, затем Python. Пришло время узнать следующий, я искал что-то новое, я выбираю Scala, потому что он совместим с Java и может быть некоторым переходом от ООП к функциональному программированию.
Это было круто, изучая новые парадигмы, новый стиль и новый образ мышления. Это был отличный опыт, просто прочитанный об элегантных концепциях Scala, и гораздо лучше код на Scala.
Читая много статей, я столкнулся с этой статьей, критикующей Scala:
Scala не является функциональным языком программирования. Это статически типизированный объектно-ориентированный язык с закрытием.
После прочтения этих статей мне пришло в голову несколько сомнений, мне очень нравится Scala и начал писать на Scala больше, но Scala подходит для определения функционального программирования? Эта статья говорит правду или просто подделывает читателей? Должен ли я изучать Haskell или какой-либо другой язык функционального программирования, чтобы действительно испытать FP?
ОБНОВЛЕНИЕ: ожидая рациональных ответов с хорошими примерами, не вызывая споров.
Ответы
Ответ 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 - это программирование с несколькими парадигмами язык, предназначенный для интеграции особенности объектно-ориентированного программирование и функционирование программирования.
Я не мог сказать ничего лучше и что все, что можно сказать, кроме бессмысленных аргументов.