27 votes

Pourquoi C # est-il un langage de programmation fonctionnel?

Il a été dit que C # peut être considéré comme un langage de programmation fonctionnel, même s'il est largement reconnu comme langage de programmation OO.

Alors, quel ensemble de fonctionnalités fait de C # un langage de programmation fonctionnel?

Je ne pense qu'à:

  1. délégués (même sans méthodes anonymes et expressions lambda)
  2. fermetures

Rien d'autre?

36voto

Juliet Points 40758

C# a emprunté un grand nombre de fonctionnalités de ML et Haskell par exemple:

  • C# 2.0 nous a apporté de polymorphisme paramétrique (ou "génériques"). J'ai entendu dire que Dom Syme, l'un des créateurs de F#, a été en grande partie responsable de la mise en œuvre des génériques dans le .NET BCL.

  • C# 2.0 permet aux programmeurs de passe et les retours des fonctions de valeurs pour les fonctions d'ordre supérieur, et a un support limité pour les délégués anonymes.

  • C# 3.0 et 3.5 prise en charge améliorée des fonctions anonymes pour vrai fermetures.

  • LINQ peut être considéré C#'s propre saveur des interprétations de la liste.

  • Les types anonymes ressembler à un rapprochement des enregistrements ML

  • L'inférence de Type est une donnée.

  • Je ne sais pas pour vous, mais C# les méthodes d'extension de regarder beaucoup comme Haskell type de classes.

  • Il ya eu beaucoup de parler de la "dynamique" de mots clés de C# 4.0. Je ne suis pas sûr à 100% de sa mise en œuvre dans les détails, mais je suis assez sûr que sa va utiliser structurels de frappe plutôt que de la liaison tardive à conserver C#'s le temps de compilation de sécurité. Structurelles de frappe est à peu près équivalent à "duck-typing pour les langages statiques", c'est une fonctionnalité que Haskell et ML les pirates ont pu profiter pendant des années.

Ce n'est pas de dire que le C# est un langage de programmation fonctionnel. Sa manque toujours des éléments importants tels que le filtrage, la queue-appel d'optimisation, et la liste et la n-uplet de littéraux. En outre, idiomatiques C# est fondamentalement impératif avec une forte dépendance à l'mutable état.

Je n'aurais pas nécessairement pris en compte certaines de ces caractéristiques mentionnées ci-dessus comme exclusive de langages de programmation fonctionnelle, mais son assez clair que le C# développeurs ont pris beaucoup d'inspiration à partir de langages de programmation fonctionnelle dans les dernières années.

33voto

Adam Wright Points 31715

Il n'existe pas de définition rigoureuse de "Langage OO", "Langage Fonctionnel", "Langue de la Procédure", on peut apporter des arguments que n'importe quelle langue s'adapte à presque n'importe quel classement; on peut écrire de procédure Java orienté objet C et fonctionnels de C++. Je l'utilise généralement une classification basée autour de ce que les principales caractéristiques sémantiques de soutien, ainsi que le développement commun de la pratique. Une bonne façon de voir les choses est d'examiner builtin populaire et de cadres, et de voir ce style qu'ils utilisent.

Les langages fonctionnels sont principalement définis comme des personnes ayant une fonction de classe primitives, avec des styles de développement qui utilisent ces pour réduire la complexité avec les expressions idiomatiques comme "la carte". Une autre caractéristique commune est la correspondance de modèle, mais je ne vois pas cela comme étant exclusivement fonctionnelle. "Pure" langages fonctionnels ont également pas d'effets secondaires, mais ce n'est pas obligatoire (voir comment floue de ces concepts? :).

Alors, qu'est-C#? Eh bien, il a d'abord fonction de classe de style primitives, avec des délégués (et a permis de mieux syntaxique de soutien pour le style avec les délégués anonymes et les lambdas). Est-il fonctionnel? Peut-être, si on écrit dans un style fonctionnel. Le Cadre de l'utilisation de ce style? Non, pas vraiment.

En tant que tel, je n'aurais pas de classe C# fonctionnelle dans la discussion générale -, il est, au mieux, multi-paradigme, avec une certaine saveur fonctionnelle.

9voto

Marc Gravell Points 482669

Ainsi, les délégués et les fermetures permettent de fonctionner dans une grande partie fonctionnelle... par exemple:

var sum = data.Sum(x=>x.SomeProp);

etc

Vous pouvez écrire la plupart des fonctions d'ordre supérieur à l'aide de lambda / délégués. L'inférence de type n'est pas tout à fait la même que pure langages fonctionnels tels que F#, mais C# générique-l'inférence de type est toujours très bon (surtout en C# 3.0).

Cela est particulièrement vrai dans .NET 3.5, C# 3.0, où LINQ prend une approche fonctionnelle à de nombreux problèmes. Mais vous pouvez toujours utiliser les aspects fonctionnels de C# avec .NET 2.0 et C# 2.0. Il est simplement plus facile avec C# 3.0 et les lambdas ;-p

En fait, le C# est un pragmatique du langage de programmation. Il vise à rendre possible l'utilisation d'un certain nombre de paradigmes, sans vous punir affreusement, si vous voulez faire quelque chose de différent.

3voto

Bill the Lizard Points 147311

Pointeurs de fonction est une autre caractéristique que C# est dans la catégorie fonctionnelle.

Je ne pense pas que C# est très largement considéré comme un langage fonctionnel, cependant. Je pense qu'il est important de souligner que vous pouvez programmer dans un fonctionnel de style dans de nombreuses langues qui ne sont pas purement fonctionnelle.

De La Programmation Fonctionnelle:

En informatique, la programmation fonctionnelle est un paradigme de programmation qui traite de calcul de l'évaluation des fonctions mathématiques et évite d'état et de données mutable. Il met l'accent sur l'application de fonctions, contrairement à l'impératif de style de programmation, qui met l'accent sur les changements dans l'état.

En utilisant cette définition, vous pouvez programmer dans un style fonctionnel dans presque n'importe quelle langue de la procédure. Purement fonctionnelle langues, juste pour la faire respecter.

3voto

Craig Stuntz Points 95965

J'ai plutôt d'accord avec les autres ici qui disent que C# est mieux décrit comme multi-paradigme que fonctionnelle. Mais je voudrais ajouter aux exemples de fonctions en C#, LINQ, un premier de la classe et relativement compréhensible système pour écrire des monades. Bien que purement fonctionnelle langues ne nécessitent pas l'utilisation de monades, l'exemple de Haskell a montré qu'ils peuvent être extrêmement utiles. Pourtant, ils sont l'une des choses les plus difficiles allez comprendre pour beaucoup de gens nouveaux à Haskell. En C#, d'autre part, beaucoup de gens écrire des requêtes LINQ ces jours sans même se rendre compte qu'ils sont en train d'écrire des monades.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X