Perché C# funzionale programmming lingua?

È stato detto che C# può essere considerato come un linguaggio di programmazione funzionale, anche se è ampiamente riconosciuto come un linguaggio di programmazione OO.

Così, che dispongono di set di C#, un linguaggio di programmazione funzionale?

Posso solo pensare:

  1. delegati (anche senza anonimo metodi e le espressioni lambda)
  2. chiusure

Qualcos’altro?

 

8 Replies
  1. 42

    C# ha preso in prestito un sacco di funzionalità ML e Haskell per esempio:

    • C# 2.0 ci ha portato il polimorfismo parametrico (o “generici”). Ho sentito dire che Dom Syme, uno dei creatori di F#, era in gran parte responsabile per l’attuazione di farmaci generici in .NET BCL.

    • C# 2.0, inoltre, consente ai programmatori di passare e restituisce funzioni come valori per le funzioni di ordine superiore, e ha un supporto limitato per i delegati anonimi.

    • C# 3.0 e 3.5 migliorato il supporto di funzioni anonime per vero chiusure.

    • LINQ può essere considerato C#’s proprio il sapore di genericità elenco.

    • Anonimo tipi di apparire come un’approssimazione di ML record

    • Inferenza è un dato di fatto.

    • Non so voi, ma C# i metodi di estensione guardare un lotto terribile come Haskell tipo di classi di.

    • C’è stato un sacco di parlare di “dinamica” parola chiave, in C# 4.0. Io non sono sicuro al 100% della sua attuazione dettagli, ma sono abbastanza sicuro che la sua intenzione di utilizzare strutturali di battitura piuttosto che l’associazione tardiva per conservare C#’s momento della compilazione di sicurezza. Strutturali di battitura è approssimativamente equivalente a “duck typing statico lingue”, è una caratteristica che Haskell e ML hacker hanno goduto per anni.

    Questo non voglio dire che C# è un linguaggio di programmazione funzionale. La sua ancora mancanti caratteristiche importanti come il pattern matching, la coda di chiamata di ottimizzazione, e la lista e tupla di valori letterali. Inoltre, idiomatiche C# è fondamentalmente imperativo con una forte dipendenza stato mutabile.

    Non vorrei necessariamente prendere in considerazione alcune di quelle caratteristiche di cui sopra esclusiva linguaggi di programmazione funzionale, ma la sua abbastanza chiaro che il C# sviluppatori hanno preso un sacco di ispirazione da linguaggi di programmazione funzionale, in questi ultimi anni.

    • C# metodi di estensione non sono come tipo di classi. Si tratta semplicemente di una sintassi utile sulla cima di metodi statici.
    • Mi piace l’analogia tra i metodi di estensione e personalizzato operatori e, soprattutto, il pipelining operatore in F#: lista |> Elenco.mappa pippo in F# corrisponde alla lista.Mappa(pippo) in C#.
    • Oh, e devo aggiungere che l’ .NET team è l’aggiunta di tuple per l’ .NET BCL (blogs.msdn.com/bclteam/archive/2008/11/04/…).
    • dynamic effettivamente utilizzare l’associazione tardiva (e non strutturali (sub-)di battitura), che è l’intero punto di dynamic.
  2. 37

    Nessun rigore la definizione di “Linguaggio OO”, “Linguaggio Funzionale”, “Linguaggio Procedurale”, si può fare di argomenti che qualsiasi lingua si adatta principalmente a qualsiasi classificazione; si può scrivere procedurali, Java, object oriented C e funzionale C++. Io in genere uso una classificazione basata intorno a quello principale semantica funzioni di supporto, insieme con lo sviluppo comune pratica. Un buon modo di guardare a questo è quello di esaminare builtin e popolare quadri, e vedere quale stile utilizzare.

    I linguaggi funzionali sono in gran parte definite come quelle con la prima classe di funzione primitive, con stili di sviluppo che utilizzano questi per ridurre la complessità con le espressioni idiomatiche come “mappa”. Un’altra caratteristica comune è il pattern matching, ma non vedo questo come esclusivamente funzionale. “Puro” linguaggi funzionali, inoltre, non hanno effetti collaterali, ma non è obbligatorio (vedi come fuzzy questi concetti sono? :).

    Così, cosa c’è di C#? Beh, ha una funzione di classe in stile primitive, con delegati (e ha guadagnato la migliore sintattica di supporto per lo stile con i delegati anonimi e lambda). Questo è funzionale? Forse, se uno scrive in uno stile funzionale. Il Quadro utilizzare questo stile? No, non proprio.

    Come tale, non avrei classe C# come funzionale in discussione generale – è, nella migliore delle ipotesi, multi-paradigma, con alcune funzionale sapore.

    • Un’altra importante caratteristica del linguaggio è pigro liste (una specie di IEnumerable). Tuttavia, pur avendo molte caratteristiche funzionali, lo stile di programmazione che si usano in C# non è funzionale.
    • Devo d’accordo con la prima frase. L’assunzione di un OO di progettazione e di esecuzione a mano, ad esempio in C non C un linguaggio OO. Ma io sono d’accordo che funzionale e OO caratteristiche stanno diventando sempre più comune in una varietà di lingue.
    • Della programmazione ad oggetti, funzionale, strutturato, imperativo, etc. non sono caratteristiche del linguaggio; si tratta di stili di design.
    • +1 per indicare come fuzzy queste distinzioni sono.
  3. 9

    Bene, i delegati e le chiusure, le consentono di operare in gran parte funzionale… per esempio:

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

    ecc

    È possibile scrivere più le funzioni di ordine superiore, utilizzando le espressioni lambda /delegati. Il tipo di inferenza non è abbastanza lo stesso come puro linguaggi funzionali come F#, C#, generico del tipo di inferenza è ancora abbastanza buona (soprattutto in C# 3.0).

    Questo è particolarmente vero .NET 3.5 e C# 3.0, dove LINQ prende altamente funzionale approccio a molti problemi. Ma è ancora possibile utilizzare gli aspetti funzionali di C# con .NET 2.0 e C# 2.0. È solo più facile con C# 3.0 e le espressioni lambda ;-p

    In realtà il C# è un pragmatico linguaggio di programmazione. Esso mira a rendere possibile l’utilizzo di una serie di paradigmi, senza punire è orrendamente se si vuole fare qualcosa di diverso.

    • Pelo nell’uovo: F# è un impuro linguaggio di programmazione funzionale, non pura. E la maggior parte delle persone sarebbe classificare C# come un “general purpose” linguaggio di programmazione (in contrapposizione a un dominio specifico di linguaggio) che supporta diversi paradigmi di programmazione, in particolare object-oriented e imperativo stile.
  4. 6

    Puntatori a funzione è un’altra caratteristica che C# ha in categoria funzionale.

    Non credo che C# è molto ampiamente considerato come un linguaggio funzionale, tuttavia. Io credo che sia importante sottolineare che è possibile programmare in modo funzionale stile in molte lingue che non sono puramente funzionale.

    Da La Programmazione Funzionale:

    In informatica, la programmazione funzionale è un paradigma di programmazione che considera il calcolo in quanto la valutazione delle funzioni matematiche e evita di stato e mutevole dati. Si sottolinea che l’applicazione di funzioni, in contrasto con l’imperativo stile di programmazione, che sottolinea i cambiamenti di stato.

    Utilizzo di tale definizione, si può programmare in stile funzionale in quasi qualsiasi linguaggio procedurale. Puramente funzionale lingue semplicemente rispettare.

  5. 3

    Io per lo più d’accordo con gli altri qui che dicono che il C# è meglio descritto come multi-paradigma che funzionale. Ma mi piacerebbe aggiungere agli esempi di caratteristiche funzionali in C# LINQ, un servizio di prima classe e relativamente comprensibile per scrivere monadi. Mentre puramente funzionale per le lingue non richiedono l’uso di monadi, l’esempio di Haskell ha dimostrato che si può essere estremamente utile. Eppure sono una delle cose più difficili, andare afferrare per molte persone nuove Haskell. In C#, d’altra parte, molte persone scrivere le query LINQ in questi giorni, senza nemmeno rendersi conto che stanno scrivendo monadi.

  6. 1

    C# ha funzionali caratteristiche del linguaggio, chiusure, per esempio. L’ .NET le biblioteche non sono scritti in uno stile funzionale, quindi, in pratica, C# non è un linguaggio funzionale. Quasi tutto è realizzato con mutazione. I tipi di raccolta sono tutti modificabili.

    • LINQ è abbastanza funzionale…
    • Che è di destra, ma è un’eccezione, non la regola.
  7. 0

    Questi sono i punti principali whow fa c# funzionale
    1-Lamba, le espressioni
    2-i metodi di Estensione
    3-Tipo di inferende
    4-Oggetto e raccolta initializators
    5-Chiusure
    6-tipi Anonimi
    7-Linq

Lascia un commento