Scala est-il un Langage de Programmation Fonctionnel? [fermé]


J'ai appris la programmation à partir de Java, puis j'ai essayé d'apprendre un langage de programmation par an, le second était C++, puis Python. Il est venu apprendre le prochain, j'ai cherché quelque chose de nouveau, j'ai choisi Scala car il était compatible avec Java et pourrait être une transition de la POO à la programmation fonctionnelle.

C'était cool, apprendre de nouveaux paradigmes, un nouveau style et une nouvelle façon de penser. C'était une excellente expérience, il suffit de lire sur les concepts élégants de Scala, et beaucoup mieux de coder sur Scala.

En lisant beaucoup d'articles, j'ai fait face à cet article critiquant Scala:

Scala n'est pas un langage de programmation fonctionnel. C'est un langage orienté objet typé statiquement avec des fermetures.

Après avoir lu cet article quelques doutes sont venus à moi, j'aime vraiment Scala et commençait à écrire sur Scala plus, mais est Scala convient définition de la programmation fonctionnelle? Cet article dit-il la vérité ou simule-t-il simplement des lecteurs? Dois je apprendre Haskell ou un autre Langage de programmation fonctionnel pour vraiment expérimenter FP?

UPDATE : Attendre des réponses rationnelles avec de bons exemples, sans provoquer de conflits.

Author: Rinat Tainov, 2011-05-29

3 answers

Scala ne vous oblige pas à écrire dans un style fonctionnel. Ceci est parfaitement valide 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))

Donc dans ce sens, horreurs, Scala estpas fonctionnel! Effets secondaires à gogo, état mutable everything tout ce que vous pouvez faire en Java, vous pouvez le faire en Scala.

Néanmoins, Scalapermet à de coder dans un style fonctionnel, et vous facilite la vie (qu'en Java) de plusieurs façons:

  • Il existe des fonctions de première classe
  • Il y a un immuable bibliothèque des collections
  • La récursivité de la queue est prise en charge (dans la mesure où la JVM peut gérer)
  • La correspondance de motifs est prise en charge
  • (etc.)

Cela semble un peu plus fonctionnel:

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)

Il convient de noter que l'auteur de cet article semble avoir une très mauvaise compréhension de Scala; à peu près tous les exemples qui semblent laids dans ses mains sont inutilement laids. Par exemple, il écrit

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

Mais ce n'est pas si mal, si vous payez attention à ce que vous faites:

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

Quoi qu'il en soit, l'essentiel est que Scala n'est pas un langage de programmation fonctionnel pur, et en tant que tel, sa syntaxe n'est pas toujours idéale pour la programmation fonctionnelle car il y a d'autres considérations en jeu. Il a cependant pratiquement toutes les fonctionnalités standard que l'on attend d'un langage de programmation fonctionnel.

 34
Author: Rex Kerr, 2011-05-29 06:02:28

Mon test décisif personnel pour un langage fonctionnel est les chiffres d'Église.

Exemple de schéma:

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

((thrice 1+) 0)
  => 3

(1+ est une fonction Scheme qui ajoute 1 à son argument. thrice prend une fonction f et renvoie une fonction qui compose f avec elle-même trois fois. Donc (thrice 1+) ajoute trois à son argument.)

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

(Depuis (thrice 1+) est une fonction qui ajoute trois, en prenant le thrice cela lui confère une fonction qui ajoute neuf.)

Et mon préféré:

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

(Raisonnement laissé comme un exercice pour le lecteur. Ce dernier exemple est le plus important.)

Si vous ne pouvez pas écrire cet exemple dans votre langue sans contorsions horribles, alors je dis que ce n'est pas un langage fonctionnel (exemple: C/C++).

Si vous pouvez écrire cet exemple dans votre langue, mais qu'il semble très naturel, alors je dis que votre langage "prend en charge la programmation fonctionnelle" mais n'est pas vraiment un langage fonctionnel (exemple: Perl).

Si cet exemple se connecte parfaitement à votre langue et ne semble pas trop différent de la façon dont vous l'utilisez au jour le jour, alors c'est un langage fonctionnel.

Je ne connais pas Scala. Si quelqu'un veut me dire où il se situe? :-)

 20
Author: Nemo, 2011-05-31 21:16:38

Scala est une programmation multi-paradigme langage conçu pour intégrer caractéristiques de orienté objet programmation et fonctionnel programmation.

Je ne pourrais pas le dire mieux et c'est tout ce qu'il y a à dire sauf pour des arguments inutiles.

 19
Author: Kim Stebel, 2011-05-29 06:11:48