Quali sono alcune buone pratiche quando si cerca di insegnare la programmazione dichiarativa ai programmatori imperativi?


13

Mi sono offerto di fare un po 'di formazione in F # presso la mia azienda e sembravano mostrare un certo interesse. Sono generalmente programmatori VB6 e C # che non seguono la programmazione con troppa passione. Detto questo mi sembra che sia più facile scrivere il codice corretto quando si pensa in una questione funzionale, quindi dovrebbero sicuramente trarne qualche vantaggio.

Qualcuno può offrire qualche consiglio su come dovrei affrontare questo?

idee

  • Non concentrarti sulla sintassi, concentrati invece su come usare questo linguaggio e gli idiomi che promuove.
  • Prova a pensare ad esempi che sono un dolore da scrivere in modo imperativo ma che si traducono in codice elegante quando scritti in modo dichiarativo.

F # e programmazione dichiarativa ?????
P:

@Pavel - È una domanda?
ChaosPandion,

3
@Pavel - OK, ti interessa spiegare perché hai fatto la dichiarazione? Questa è la seconda volta che fai commenti estremamente vaghi. È molto scortese.
ChaosPandion,

3
it.wikipedia.org/wiki/Declarative_programming La programmazione funzionale è un tipo di programmazione dichiarativa. Inoltre, +1, buona domanda.
Nota per se stessi - pensa ad un nome il

2
@Chaos, a mio avviso, F # non supporta il paradigma della programmazione dichiarativa. La sua entusiasta valutazione e le caratteristiche imperative rendono il linguaggio semplicemente una forma conveniente e funzionale di denotare le stesse affermazioni imperative che usi, diciamo, in C #. Dai, persino makeè più un linguaggio dichiarativo di F # o Caml! (Ironia della sorte, questo semplifica il tuo lavoro.)
P Shved

Risposte:


5

La programmazione funzionale è una strana bestia per me. Ho imparato F # e Haskell, ho scritto alcuni semplici programmi e adoro usarli, ma non ho mai avuto il "lampo di rivelazione" di cui alcune persone parlano. Ma lentamente, ho notato che sempre più stavo scrivendo codice che doveva essere immutabile, suddividendo le attività in funzioni più piccole e più piccole e cercando di usare i delegati molto di più. È una cosa che, se ti piace, si insinua nel tuo lavoro perché il valore di quelle tecniche è evidente.

Ora, più praticamente per l'allenamento: trovo che due concetti facciano davvero clic su Programmazione funzionale come stile per me.

Innanzitutto, lo stile FP si basa sulla struttura dei dati, non sulla composizione come in OOP. Ho visto qualcosa come List in C # come un trucco intelligente per generare elenchi sicuri, qualcosa che ha composto il tipo (stringa) nell'altro tipo (elenco). Dopo aver appreso FP, ora guardo ai generici più simili a Monadi. L'elenco è una forma strutturata che il codice può assumere e decora le stringhe.

In secondo luogo, e forse più utile per i programmatori C # / ASP, è l'idea che FP funzioni su ricorsione e ripetizione, mentre OOP lavora su mutabilità e loop. Tendo a pensare al ciclo di vita della pagina ASP come a una sorta di FP ora: ogni richiesta viene elaborata da zero attraverso l'intero ciclo di vita, quindi l'intera pagina è, in effetti, un grande programma che si ripete lentamente. Se riesci a restringere questa nozione, avrai un'idea migliore di come un programma imperativo può essere strutturato attorno a cicli di funzioni che accettano dati, operano su di esso e restituiscono nuovi dati invece di modificare il vecchio.

L'ostacolo più difficile, almeno per me, da superare con questo approccio è che l'affondamento della sensazione che stai sprecando tonnellate di risorse quando usi oggetti mutabili risparmierebbe un sacco di memoria. In GC ci fidiamo e ho dovuto imparare a lasciar andare i problemi di prestazioni fino a quando non ho visto il programma in esecuzione e verificato se ce n'erano addirittura, e in tal caso usare un profiler per vedere esattamente dove fossero i problemi.



1

Molti linguaggi di programmazione imperativi (Ada, C / C ++, Turbo Pascal, FoxPro) hanno la capacità di definire il puntatore a funzioni o letterali di nomi di procedure che possono essere valutati (e le procedure che prendono il nome dal letterale invocato) in fase di esecuzione.

L'esempio tradizionale è qsort in C. Basati sull'idea che è possibile definire algoritmi che eseguono altri algoritmi su strutture di dati. Ovviamente questa è solo una frazione di ciò che è la programmazione funzionale. Ma ho scoperto che questo è un buon punto di partenza per far affondare l'idea.

Una volta che affonda, puoi iniziare ad approfondire altre cose (immutabilità, condividere nulla, ecc.)


Correzione: ciò che intendo dire è basato sull'idea che è possibile definire algoritmi parametrizzati che possono prendere ALTRI algoritmi come parametri ed eseguirli su strutture di dati.
luis.espinal,

1

Qualcuno può offrire qualche consiglio su come dovrei affrontare questo?

Sicuro:

  • Scegli i tuoi esempi con attenzione in modo che il tuo codice F # non solo risolva un problema elegantemente ma anche molto più elegante di quanto sia possibile con C # / VB . La corrispondenza del modello e l'inferenza del tipo sono i tuoi amici qui.

  • Utilizzare un esempio per evidenziare i vantaggi della nuova funzione presente in F #, ad esempio flussi di lavoro asincroni, modelli attivi.

  • Non abbiate paura di dare esempi impuri usando strutture di dati mutabili quando appropriato. F # è impuro per un motivo.

  • Non presentare F # come panacea. Descrivere le applicazioni per le quali F # non è adatto così come quelle per le quali è molto più adatto rispetto ad altri linguaggi .NET.

  • Indica i campioni di giocattoli che possono studiare e progetti di successo nel mondo reale che utilizzano F # (Bing AdCenter, Halo 3 ecc.).

  • Spiega tutto in termini di come F # può aiutarli a risolvere i problemi più facilmente. Evita i dibattiti religiosi. Rimani positivo su F #, non negativo su altre lingue. Armali di fatti e prove, ma lascia loro trarre le proprie conclusioni.

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.