Presentazione della programmazione funzionale nel proprio ambiente di sviluppo [chiuso]


15

Questa è una lunga storia, ma cercherò di sintetizzarla nel miglior modo possibile. Siamo un negozio .NET che scrive software per una varietà di diversi tipi di fondi. Ad esempio, scriviamo software di gestione delle indicazioni sulla salute, software di gestione delle pensioni, software 401 (k) e alcune altre cose di tipo finanziario.

Ora stiamo entrando in un nuovo regno: derivati ​​e analisi quantitativa del tipo di lavoro, che sembra molto eccitante. Questo è qualcosa che sta per accadere nei prossimi 8-12 mesi, mi è stato detto.

Ora, ho imparato un po 'di programmazione funzionale da solo, principalmente solo sguardi superficiali a varie lingue tramite questo libro, ma non ci ho mai veramente approfondito. Ora, poiché siamo un negozio .NET, pensavo che F # potesse essere una buona scelta, perché potremmo potenzialmente sfruttare alcune librerie .NET e possibilmente le conoscenze esistenti.

La mia domanda è: da dove cominciare? Sto attraversando un periodo estremamente difficile nel cercare di capire se dovrei andare con Haskell, Erlang, Scala, F #, ecc. Sembrano tutti molto interessanti e capaci e francamente questa potrebbe essere una buona occasione per sfuggire alla dipendenza da Microsoft.

Qualcuno ha avuto una situazione simile? In tal caso, qual è stata la tua esperienza nel rendere funzionale il salto e cosa hai scelto e perché? So che questa è una specie di grande domanda, ma non conosco nessuno sviluppatore che sta usando metodi funzionali in questo momento, quindi non ho nessun altro posto dove girare altro che Googling incessantemente e trovare guerre di fiamma ovunque sul miglior linguaggio funzionale.


lettura consigliata: Da dove cominciare
moscerino il

Risposte:


14

Prototipo, prototipo, prototipo! Prendi un po 'di funzionalità aziendale che ritieni richieda una programmazione funzionale e prova le varie lingue e vedi se ti danno davvero i vantaggi e l'interoperabilità che stai cercando.


Un buon consiglio e lo ascolterò, infatti sto facendo un'installazione di Erlang in questo momento per provarlo.
Nodey The Node Guy,

10

La prima domanda a cui devi veramente rispondere sinceramente è perché stai pensando di usare un linguaggio funzionale. Se non riesci a giustificare un motivo commerciale per il passaggio, non dovresti farlo. In altre parole, voler introdurre un nuovo framework, linguaggio o altre nuove tecnologie nel proprio ambiente di lavoro solo perché si desidera impararlo o perché sembra che la prossima cosa "interessante" sia sicuramente un errore. Quindi devi prima chiederti sinceramente qual è la motivazione.

Se ritieni davvero di aver bisogno di un linguaggio funzionale per risolvere un particolare problema e supponendo che la maggior parte dei linguaggi funzionali tradizionali soddisferà le tue esigenze, allora andrei con il più maturo e quello con la più grande comunità di utenti. Erlang è una buona scelta e soddisfa entrambi questi requisiti, tuttavia, in un ambiente puramente ms / .NET, posso capire usando F #.


2
@ennukiller - Posso sicuramente vedere che la programmazione funzionale sarebbe una buona scelta per noi e non mentirò - mi piacerebbe anche usarlo solo per la pura stimolazione intellettuale che fornirà. Faremo enormi quantità di calcoli e voglio sfruttare il multi-core. Inoltre, è imperativo che ogni funzione matematica sia dimostrata corretta, capisco che potrebbe essere più facile con funzionale.
Nodey The Node Guy,

2
Se hai bisogno di prove, la migliore programmazione funzionale è la migliore. Alcuni suggerimenti qui sono per componenti aggiuntivi funzionali a linguaggi imperativi: potrebbero essere più familiari, ma non ti daranno un codice dimostrabilmente corretto. In presenza di effetti collaterali, non è possibile utilizzare il fatto che x = x ("trasparenza referenziale") e si deve dimostrare che la x più avanti nel codice conserva ancora lo stesso valore di prima. In alcune lingue, ad esempio, può succedere che si x:=3; y:=10; x:=add(x,x);ottenga un valore xche non è 6 e un valore yche non è 10. Dimostrare che le funzioni corrette in questo contesto non è pratico.
AndrewC,

9

Concordo fortemente con F # per un negozio con una base di codice .Net esistente, così come sarei fortemente d'accordo con Scala per un negozio con una base di codice Java esistente.

La programmazione funzionale è uno strumento come un altro. Usato bene e integrato con il modo in cui stai già sviluppando il codice, può renderti più produttivo rendendo più facile ragionare su ciò che il tuo codice sta facendo. Il cambio delle lingue è tutt'altro che gratuito, quindi la soluzione migliore è una soluzione che ti consente di utilizzare il più possibile il codice esistente il più a lungo possibile nella transizione. Il modo più sicuro per non introdurre una nuova lingua nel tuo ambiente, dopo tutto, sarà quello di dire ai tuoi colleghi che devono riscrivere tutto ciò che hanno finora per vedere i benefici di un cambiamento che, a questo punto, stai ancora cercando di venderli.


7

Consiglierei di iniziare la programmazione funzionale senza anche imparare subito una nuova lingua. Rende solo più difficile se stai cercando di imparare un nuovo paradigma quando stai anche cercando di capire la sintassi di una nuova lingua.

Naturalmente, i linguaggi che sono stati specificamente sviluppati per eseguire la programmazione funzionale avranno alcuni vantaggi (come avere costrutti specifici come la comprensione e rendere immutabili le strutture di dati di default), ma in generale il passo più grande da fare è cambiare il tuo pensiero in funzionale stile. C # è ottimo per farlo.

Fondamentalmente, smetti di cambiare lo stato del tuo codice. L'ho fatto usando Java ed è ancora più facile con C # perché hai lambda. Una volta capito lo stile e la sensazione di ciò per cui è buono, sarà molto facile imparare un linguaggio funzionale (indipendentemente dal fatto che sia F # che scegli o Erlang) ed essere immensamente produttivo con esso.


1
+1: sono d'accordo con te. Ho anche iniziato a programmare in uno stile più funzionale in Java e C ++ (usando più variabili finali e const, interrompendo operazioni complesse usando la composizione delle funzioni e così via). Penso che questo abbia decisamente migliorato il mio stile di programmazione in Java e C ++. Dopo un po ', quando ci si sente pronti per andare oltre, si può provare un linguaggio funzionale (Haskell, Ocaml, SML, Lisp, Scala, F #, ecc.)
Giorgio

1

Se tutto ciò che vuoi è imparare e comprendere la programmazione funzionale, installa semplicemente IronPython e concentrati sulle funzionalità funzionali in Python. Nel peggiore dei casi, imparerai uno strumento che può essere integrato con C # per ridurre il numero di righe di codice in un'applicazione e aiutarti a fornire più prodotti privi di bug prima del previsto.

Dai un'occhiata alle presentazioni di DaBeaz sui generatori per un esempio di come gli approcci funzionali in Python possono semplificare cose complesse http://www.dabeaz.com/generators/

A parte questo, penso che sarebbe saggio investire un po 'di tempo con Scala. Funziona su .NET in modalità beta, quindi puoi installarlo e usarlo oggi per scopi di apprendimento e, entro l'autunno, sarà in modalità di rilascio per .NET. Ciò significa che è possibile scrivere in Scala un codice portatile su JVM e .NET. E poiché Scala si basa su attori e passaggio di messaggi, è molto, molto semplice creare un'applicazione composta da diversi programmi separati in esecuzione su più macchine separate. Quando aggiungi la portabilità .NET / JVM al mix, c'è un altro aspetto da considerare. Potresti avere un'applicazione che sfrutta sia le librerie Java di terze parti sia le librerie .NET di terze parti senza fare confusione con lo sviluppo di protocolli per farli comunicare. Entrambi i processi sarebbero stati scritti in Scala, e userebbe la messaggistica remota Scala (attori remoti) per comunicare. Dai un'occhiata all'Akka, la biblioteca che sembra che alla fine entrerà a far parte della biblioteca standard di Scala a giudicare da ciò che Typesafe.com sta facendo.


+1: per menzionare Scala e la sua disponibilità su piattaforme diverse. Domanda: Akka sostituirà l'attuale implementazione dell'attore in Scala? O i due esisteranno fianco a fianco?
Giorgio,

Non sono sicuro che Akka sostituirà presto gli attuali attori della Scala, ma il creatore della Scala Martin Odersky si è unito al creatore della Akka Jonas Boner nella compagnia Typesafe. Stanno promuovendo pesantemente la Scala con Akka e ora con il framework Play. Quindi è probabile che il focus dello sviluppo sarà su Akka. Se stai solo imparando attori con Scala, sarebbe meglio concentrarsi prima su Akka.
Michael Dillon,

Grazie molte per l'informazione! Ho dato un'occhiata agli attori alla Scala, ma finora solo molto superficiale.
Giorgio,

-1

Sono certamente d'accordo con la spinta principale della risposta accettata, e dato che in pratica ti stai immergendo a fondo nelle cose facendo una prova a Erlang sembra che tu abbia una buona comprensione di come impari e hai solo bisogno di un po 'di spinta nella giusta direzione, così chiaramente è stata una buona risposta per te ... Ma, penso che avrei affrontato la domanda in modo leggermente diverso, dal momento che vedo che questa risposta non mi avrebbe aiutato molto; Codice sempre per imparare! Quindi, ecco i miei pensieri ...

(A proposito, tendo ad andare avanti nei dettagli più adatto, per esempio, ai capitoli di un libro, e sono sicuro di non poter soffocare completamente il mio istinto qui, ma proverò una virata diversa; riassumendo semplicemente i miei pensieri qui, e nel caso qualcuno volesse maggiori dettagli su qualcosa, o pensi che qualcosa che dico sia fuorviante in questo formato, farò del mio meglio per ricordare di passare attraverso i promemoria di risposta ...)

Per cercare di mantenermi in attività ecco la mia comprensione delle domande spinte poste nel PO; Terrò il margine laterale al minimo, se necessario, per spiegare ....

Innanzitutto le risposte rapide:

ero in una situazione simile? Almeno era simile; Ero in una posizione di testa facendo molti progetti vari che erano comunque correlati ... (CRM / Web / DB / Integrazione dei dati / ecc.)

come / perché ho fatto il salto funzionale? " Ho visto alcuni esempi LINQ e sebbene avessi sicuramente sognato una sorta di linguaggio di query integrato, tipicamente statico [come avevo usato principalmente linguaggi tipicamente statici (principalmente C ++, e successivamente C # )] per tutta la mia carriera ... Ma ero in un ambiente a fuoco piuttosto rapido, e anche se spesso ero riuscito a vedere cosa stava succedendo in passato, non ci avevo mai pensato, quindi non l'ho mai previsto potrei / consentire le operazioni su Plain Old Objects (lol!) altrettanto facilmente; quando l'ho visto sapevo che dovevo averlo ... quindi, questo è il perché e l'inizio del come: mi sono concentrato sull'imparare a capire LINQ .

Quattro pensieri ... errr, no non è giusto ... Pensieri

Quando ho letto la risposta di Martijn Verburg , la menzione della funzionalità aziendale mi fa subito venire in mente di iniziare a implementare il codice per tutto quello su cui sto lavorando ... A seconda di quanto superficialmente quella sperimentazione iniziale potrei rispondere diversamente, ma supponendo che fosse solo immergendomi nell'alluce, non sono sicuro di avere qualcosa direttamente per lavoro (o lavoro a breve) che mi avrebbe fornito l'eccitazione / passione che penso dovresti avere per i primi problemi che inizi ad affrontare ...

Ero quasi interamente radicato in linguaggi tipicamente statici + metafore e schemi OOP + qualunque cosa avessi finito per avvolgere il mio cervello accidentalmente mentre risolvevo i miei problemi reali nel corso degli anni ... Indica che, se sei come me, probabilmente avrai molto cervello dedicato a cose che non ti aiuteranno molto con LINQ / FP.

Ci penso un po 'come pura programmazione procedurale rispetto a OO: ci sono molte cose procedurali che finirai per usare in OOP, ma quelli che arrivano in C ++ da C senza renderlo una priorità per grok / ken / "get" OO finiscono per essere molto male in C ++. In realtà ho intervistato moltissimi sviluppatori (15+) di firmware e driver di dispositivo di lunga data che credevano davvero di conoscere il C ++, ma che, al massimo , avevano una comprensione terribilmente di base / manuale del C ++, praticamente senza comprensione o esperienza in OOP — perché non hanno mai effettivamente fatto OOP ... Hanno scritto classi multiuso singleton con membri statici e funzioni statiche con una quantità di classi non statiche / non singleton che sono state usate come strutture.

E FP ha alcuni concetti allo stesso modo strabilianti (per coloro che non sono cresciuti sul paradigma) e altre cose che lo accompagnano, e (anche se ho trovato l'ibridazione di molte tecniche ideale per me), capisco di più e più col passare del tempo, esattamente quanto limitato era il mio pensiero prima di ottenere reali capacità funzionali nel mio set di strumenti; In passato ero riuscito a implementare molte cose in un modo un po 'più creativo che forse la maggior parte dei programmatori OO, ma mentre uso i concetti di come il mio pensiero fosse stentato prima ... Ci sono intere classi di problemi che possono essere risolti in poche righe che un tempo richiedevano moltissime contorsioni in C ++ / C #.

improvvisamente ti ritrovi ...

In un post "troppo lungo"

Sei in un labirinto di contorti "non letti", tutti uguali.

Vedi una teleconferenza nel prossimo futuro, in rapido avvicinamento.
> terse
Uh Huh. Sicuro. Ok, diremo che la modalità "terse" è "on".

Vedi una teleconferenza nel prossimo futuro, in rapido avvicinamento.
> cosa dovrebbe significare?
Sto solo dicendo. Non hai dovuto fare qualcosa stamattina?

Vedi una teleconferenza nel prossimo futuro, in rapido avvicinamento. 
> ehi, è una grinta dietro di te?
Che cosa!? DOVE?! [scappa urlando]

> Scusa, non ho capito COSA DOVE, riformulare?
[continua a correre e urlare, il sarcasmo inosservato]

Quindi ... Cosa dovrei imparare, caro PSE, caro PSE?

Ho iniziato personalmente in C # con LINQ. Mi ha permesso di introdurre alcuni concetti alla volta, e mentre leggevo costantemente di FP e dei suoi concetti, e più LINQ, e la relazione tra i due, mi ha dato una via da seguire mentre continuavo a lavorare in modo produttivo. Ho aggiunto alcune cose alla volta, le query sui dati sono diventate rapidamente uno strumento utile per me senza dover capire un sacco.

Ora, ripensandoci, vorrei che fossi stato in grado di fare il mio prossimo progetto (affrontato circa un anno dopo) per primo; Ho acquisito una discreta familiarità con F # (che, per inciso, mi ha dato un grande vantaggio nell'apprendimento della ML (metalinguaggio) e dei suoi derivati ​​(ad esempio, anche OCaml ).

Fondamentalmente, penso che una risposta decente a "cosa" dipenda dalla ricerca di un buon abbinamento di alcuni problemi di programmazione che ti interessano, ma ovviamente deve accoppiarsi con un po 'di FP che vuoi imparare ... (e puoi sciacquare / ripeti / insapona dopo aver eliminato qualcosa dall'elenco ...) E, naturalmente, finisci sempre per imparare un po 'di più rispetto alla cosa principale che hai deciso di fare; all'inizio ho fatto alcuni piccoli passi, ma poi ho finito per fare cose più grandi e lasciare che le cose più piccole andassero a posto mentre le facevo.

Innanzitutto, cosa fa galleggiare la tua barca? Soprattutto all'inizio è meglio avere qualcosa di divertente ed eccitante (per te) e che manterrà il tuo interesse abbastanza da renderlo utile per te. Quindi, IOW problemi su cui lavorare e tecniche che risolvono questi problemi ... LINQ e inline query di dati per me all'inizio. La ricorsione era un'altra per me, inclusa la ricorsione della coda, ne scavavo la GodelEscherBach-ness; e avevo letto della ricorsione della coda. In questo periodo, le cose a cui stavo lavorando sono state messe in attesa, e alla fine ho avuto un grande intervallo di tempo, quindi sono stato in grado di continuare a lungo. È stato più facile con meno interruzioni, ma poiché ho scelto cose che pensavo fossero divertenti, non è stato poi così difficile anche con l'interruzione del lavoro. :)

E anche se non ho trovato niente di interessante di cui posso parlarti come il programma Crab autocosciente, sono riuscito a farlo abbastanza bene.

E ... Con cosa dovrei impararlo, caro PSE, caro PSE, con cosa?

Per questo, ho usato vari algoritmi a cui mi è capitato di essere comunque interessato, oltre a varie cose che mi chiedevo se avresti potuto fare in F #, e quando sarei rimasto senza idee avrei affrontato cose come 99 bottiglie di birra e il Project Euler problemi ...

Sono sicuro che puoi trovare molte cose che ti interessano per le quali FP è rilevante; offre di tutto, dai miglioramenti a OOP che ti aiutano a dire le cose in modo un po 'più succinto fino a distorcere il modo in cui avresti pensato prima in una forma che non riconosci e probabilmente non aveva nemmeno il modello mentale da esprimere prima.

Ma ... c'è un buco nel mio modello, caro PSE un buco ...

Ed è per questo che è importante che, specialmente all'inizio, ma in realtà durante tutto il tuo tempo imparando (e non è sempre vero quando stai imparando qualcosa?) Almeno prenditi un po 'di tempo tra i problemi per leggere cose non correlate ma ancora FP e tempo per leggere il codice sorgente scritto da esperti, preferibilmente risolvendo gli stessi problemi o simili; così come le loro spiegazioni delle cose ...

E nel frattempo, devi sforzare il tuo cervello per capirlo tutto, non dalla tua vecchia prospettiva ma dall'interno dello stesso FP ... Ad un certo punto per me, ha fatto clic e ... la cosa che posso meglio mettere in relazione con esso sta diventando più o meno fluente in olandese; ad un certo punto sono riuscito a mettermi abbastanza nella mentalità (l'ho fatto tramite immersione, che è fondamentalmente ciò che ho descritto qui; immergersi in FP piuttosto che cercare di impararlo solo attraverso "libro di larnin" ...

E alla fine l'ho fatto; Sono riuscito a interiorizzare tutto e girare il cervello fino a quando non ho iniziato a far scoppiare FP / LINQ senza di me nemmeno dover fare uno sforzo per tradurlo in OOP. (Sì, l'ho fatto; dovevo avere qualcosa su cui appendere la gonna. Cappello. Qualunque cosa.)

Pensieri finali...

Mio, mio, sembra che tu stia perdendo la tua capacità di pensare alla tua firma intelligente
titoli di sezione. Che peccato.

La teleconferenza si sta ancora avvicinando rapidamente. Sembra molto più grande ora.
> si, si, beh .. conciso e tutto. Vedo che sei riuscito a perdere quella grinta.
 vicino, che ... beh, sì, sono ter ... OH NO È TORNATO!
AAAAAAAHHHHHH !! [scappa urlando, ancora una volta]

La teleconferenza si sta ancora avvicinando rapidamente.
Assomiglia in qualche modo a Sir Lancyjohn Cleezewiz.
È quasi alle tue spalle.
> ehi, sbrigati a tornare! Ho un esperimento da provare con te! (e un po-ta-to)

Puoi trovare molte informazioni online su FP, naturalmente. La cosa principale è capire i concetti di base e quindi imparare ad applicarli. Ad esempio, scopri l'immutabilità e perché è importante / utile per FP. Consiglio vivamente di apprendere un po 'di teoria per andare d'accordo con tutto, ad esempio come il PQ puro può essere molto più suscettibile alla prova formale. Questa era una forza trainante dietro il progenitore di F #, ML. YMMV, ovviamente, potresti essere qualcuno annoiato dalle lacrime, nel qual caso, molti esempi, molte prove ed errori per vedere esattamente perché le tecniche utilizzate sono ciò che sono ti aiuteranno ad avere questo "Ah!" momento della lampadina.

Quindi, per ora lo lascerò a quello. Spero che questo sia di qualche utilità per qualcuno. Volevo approfondire un po 'le cose specifiche da imparare, ma per il momento non sono in tempo. Spero di trovare un po 'di tempo per tornare presto, anche se sta cercando di essere una settimana lunga per me, quindi probabilmente sarà almeno il fine settimana.

<3 "Presentazione di GRUEBOL, un punto fermo; solo fino alla fine di SnozzML. Dovrebbe essere presto; ho avuto un enorme comitato che mi ha aiutato questa volta." --Grace Hopperwit Egghead, Famous Last Words , XX97 GUE <3


cos'è "caro SO"?
moscerino il

era caro overflow dello stack; dovrebbe corrispondere alla cadenza della canzone "C'è un buco nel secchio" xD
shelleybutterfly,

se pubblicato al di fuori di SO, questo sembra rendere i tuoi punti più difficili da capire - considera la modifica per tenerne conto
moscerino

derp! si certo, l'ho fatto. tyvm. :)
shelleybutterfly,

se qualcuno ha suggerimenti su come migliorare la mia risposta, lo apprezzerei .. era cattivo umore? o cattivo consiglio? è in realtà basato sulla mia esperienza, quindi sono felice di modificarlo se posso renderlo più utile. grazie;)
shelleybutterfly
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.