Quindi la domanda si riduce a: sono c'è alcuna ragione, a parte un preferenza di un paradigma all'altro o qualche squadra o le preferenze aziendali, che renderebbe si sceglie F #, piuttosto di IronPython o vice versa? Supponendo di essere altrettanto sicuro di entrambi nello ? O sono esattamente equivalenti per tutti gli scopi pratici?
Come avviene di solito, "dipende da quello che stai facendo" Ma dal momento che lei ha chiesto, cominciare da qui:
Toolset diversità
Nel mio punto di vista, è IronPython essenzialmente lo stesso di C# con una sintassi leggermente diversa - lo so, è una generalizzazione radicale per due lingue con sistemi di tipo completamente dissimili, ma non sono altro che posso dire di un altro imperativo, il linguaggio OO. Che si tratti di C#, o Java, o C++ o Python, si risolvono le lingue usando approssimativamente le stesse tecniche, idiomi, strategie, stile, ecc. Se si è sviluppatori .NET, si è quasi certamente lavorato con C# o VB. NET, e hai già scritto codice in uno stile imperativo per tutto il tempo in cui hai utilizzato le lingue.
Il più grande punto a favore di F # è semplicemente che incoraggia stili di programmazione più funzionali, minimizza le astrazioni attraverso l'ereditarietà OO a favore della composizione di funzioni, l'immutabilità come predefinita invece che come un secondo pensiero e così via. Se si desidera scrivere codice funzionale, è necessario utilizzare un linguaggio funzionale.
Concesso, è possibile scrivere lo stile funzionale in C# e Python, ma le funzionalità vengono innestate come un ripensamento. Python manca di lambdas multilinea e C# è troppo prolisso e occasionalmente buggy per utilizzare lo stile funzionale nei luoghi in cui si desidera utilizzarlo, C# in particolare ha un intero boatload of gotchas per i delegati e l'acquisizione di variabili locali, entrambe le lingue mancano di ottimizzazioni tail-call quasi ovunque tu voglia usarli, il tipo di inferenza di C# è uno scherzo rispetto a F #. Ho provato ad usare C# come linguaggio funzionale con risultati esilaranti male :)
Ora molte persone potrebbero ammettere che i problemi rendono difficile, ma non impossibile da programmare in uno stile funzionale usando C# o Python. Tuttavia, secondo la mia esperienza, non sono le lingue a renderlo impossibile, sono i programmatori della tua squadra.Se hai 10 o 12 persone che scrivono codice in una lingua imperativa, non sarai in grado di applicare uno stile funzionale per molto tempo - le lingue non fanno nulla per scoraggiare lo stile imperativo. E dal momento che i programmatori codificano già in quello stile, questo è ciò che ottieni. A meno che tu non abbia degli appassionati di FP davvero hardcore e un po 'masochisti nella tua squadra, non credo che potrebbe imporre uno stile di programmazione puramente funzionale in un linguaggio imperativo per molto tempo.
L'argomento migliore a favore di F # non è necessariamente la stessa programmazione funzionale, ma la vera diversità del set di strumenti. Ottieni un ROI più grande accoppiando F # e C# (paradigma di programmazione diverso e sistema di tipo simile) rispetto all'accoppiamento di IronPython e C# (stesso paradigma di programmazione e sistema di tipi diversi).
caso di studio di mia azienda
Ok, con questo detto, ho cercato di spingere per F # alla mia azienda. Non entrerò in un'enorme quantità di dettagli su ciò che facciamo, ma essenzialmente il mio team guida gli utenti attraverso il processo di ordinazione di servizi via cavo e telefonici per aziende come Time Warner, ComCast e altri fornitori di servizi via cavo.
È davvero un processo più complesso di quanto sembri. Per cominciare, c'è un complicato motore di regole che determina la disponibilità di prodotti, dipendenze ed esclusioni tra prodotti, ecc. Passiamo al grafico del motore delle regole e ne costruiamo un albero decisionale, quindi passiamo l'albero a un client in modo che possano visualizzalo all'utente e raccogli l'input dell'utente, la GUI della mappa del client torna alla struttura delle nostre decisioni, camminiamo sull'albero e convalidiamo tutto contro il motore delle regole, ecc.
Direi che il 95% del nostro codice è semplicemente la navigazione , manipolando e processando strutture dati ad albero. In questo momento, tutto ciò che scriviamo è C# e il suo tipo di confusione. Per inciso, uno dei punti di forza di F # è la manipolazione degli AST e dell'elaborazione simbolica (vedere un confronto di C# and F# code for processing ASTs), e tutto questo è possibile perché la corrispondenza dei modelli è impressionante.
La corrispondenza di modelli è una vera caratteristica killer, è esattamente ciò che il nostro codice C# deve pulire, ed è per questo che abbiamo bisogno di F #. Non abbiamo alcun uso per IronPython perché non è migliore per l'elaborazione simbolica di C#.
Sommario
paradigma di programmazione funzionale e pattern matching sono due caratteristiche assassino ti fanno piacere con F # di tutti i giorni. Potrei andare sul modello di threading di F # , sul passaggio di primitive di concorrenza, sul supporto delle monadi, su nuove funzionalità come i pattern attivi e così via, ma sono tutti commenti in grassetto. Per me, le sue due caratteristiche killer che rendono il caso per F # su Python - almeno per i miei progetti.
Quale preferisci di più (entro i limiti dei tuoi requisiti funzionali e politici)? –
Non penso che sia una domanda stupida, ma è bizzarra. Sono lingue molto diverse con cui sviluppare, oltre ad essere piuttosto di nicchia, e non mi aspetto che più di un paio di persone sul pianeta, tranne che tu abbia mai dovuto fare questa scelta. Qualcuno che probabilmente ha appena parlato con la lingua con cui erano più familiari. – Kylotan
Se la tua domanda fosse "onesta" avresti riconosciuto il fatto che ho già smentito il tuo primo punto due volte riferendoti alla struttura di dati "Set" incorporata di F #. –