Modelli di design funzionali [chiusi]


106

Esistono molti idiomi funzionali: monadi, applicativi, frecce, ecc. Sono documentati in diversi articoli ma sfortunatamente non conosco nessun libro o articolo in cui siano riassunti in un unico posto (c'è Typeclassopedia ma ne ha molti di aree che non sono coperte bene). Qualcuno può consigliare un articolo / libro che li copre bene in un unico posto e che può essere accessibile a un programmatore con competenze intermedie in FP?


Non risponde direttamente alla tua domanda, ma quest'altra domanda ha alcune informazioni interessanti (e almeno un link o due): stackoverflow.com/questions/327955/…
reuben

15
Potresti approfondire quali aree ritieni che la Typeclassopedia non copre bene?
dave4420

2
@ dave4420 Se leggo typeclassopedia dall'inizio alla fine, più leggo e meno capisco. Le prime sezioni sono davvero buone, ma le ultime sezioni sono difficilmente leggibili per me.
Konstantin Solomatov

3
@KonstantinSolomatov potrebbe essere che dovrai cercare le sezioni che non capisci, guardare i post del blog e guardare attentamente il codice. tutti questi "modelli di progettazione" nella tipografia sono in realtà astrazioni, e spesso profonde, che a volte richiedono un po 'di tempo per essere assorbite.
jberryman

1
@DanBurton non sono sicuro se hai letto male il mio commento, ma li classificherei come astrazioni profonde, anche se è facile dimenticarlo quando hai avuto il tuo "Ah ah!" momento.
jberryman

Risposte:


35

Il mio suggerimento è, se vuoi imparare Scala, di leggere il libro di Paul Chiusano e Runar Bjarnason:

http://manning.com/bjarnason/

Parte II: Progettazione funzionale e librerie combinatrici

  1. Fare piccoli linguaggi
  2. Serializzazione JSON
  3. Test basati sulle specifiche
  4. parser
  5. Parallelismo puramente funzionale
  6. Stato puramente funzionale

Parte III: modelli di progettazione funzionale

  1. Il caso dell'astrazione
  2. monoidi
  3. funtori
  4. monadi
  5. Funtori applicativi
  6. Strutture dati attraversabili e pieghevoli
  7. Comonads

Parte IV: Infrangere le regole: effetti e I / O

  1. Effetti contro effetti collaterali
  2. Elaborazione del flusso e I / O incrementale
  3. Applicazione dell'ambito degli effetti con il sistema di tipi

31

Mi dispiace non essere a conoscenza di articoli o libri che trattano in dettaglio i diversi usi di tutti questi costrutti, ma posso darti alcuni link a singole risorse.

Un modello abbastanza comune è costruire trasformatori monadi invece di semplici monadi (vedere anche il collegamento nel paragrafo successivo). Fondamentalmente significa che costruisci qualcosa che deve essere combinato con altre monadi, risultando in una più complessa in grado di gestire le caratteristiche di entrambe.

In Real World Haskell ci sono alcuni capitoli sulle monadi. Nel Capitolo 14. Monadi gli autori spiegano le basi e alcuni usi comuni (forse, elenco, stato). Il Capitolo 15. Programmare con le monadi fornisce ulteriori spiegazioni su come usarle in modo efficace (copre anche la monade del lettore). Il capitolo seguente spiega come usare Parsec , ma potrebbe essere più interessante cercare articoli che spieghino come funziona effettivamente: dovrebbe essere un ottimo esempio di un uso ben organizzato delle monadi per l'analisi. Fianlly, Capitolo 18. Trasformatori monadeintroduce come funzionano i trasformatori monade e poi mostra come costruirne uno, passo dopo passo. Interessanti anche le considerazioni verso le sezioni finali del capitolo.

Ho letto una volta una domanda davvero interessante su SO sugli usi creativi delle monadi . I collegamenti proposti erano letture fantastiche sull'argomento. Con quello spirito, ho provato a chiedere lo stesso per le frecce : sicuramente ho avuto meno risposte di quella sulle monadi, ma comunque interessanti.


Per quanto riguarda i modelli OOP della banda di quattro, c'è una bella serie di 3 articoli di IBM sull'argomento nella loro serie Pensiero funzionale . Il linguaggio funzionale di destinazione è Scala. Procedono spiegando i normali schemi di progettazione in OOP e mostrando come si mappano in Scala.

  1. Pensiero funzionale: modelli di progettazione funzionale, parte 1 . Qui coprono fabbriche, metodi modello, strategia, peso mosca. La linea di fondo è che avendo le funzioni come valori di prima classe, tutto è molto più semplice.
  2. Pensiero funzionale: modelli di progettazione funzionale, parte 2 . Si tratta di java e groovy . Affronta il modello dell'adattatore.
  3. Pensiero funzionale: modelli di progettazione funzionale, parte 3 . Qui si parla dello schema dell'interprete. Ancora una volta, la lingua di destinazione è fantastica.

L'articolo più rilevante rispetto alla tua domanda è sicuramente il primo, ma gli altri due possono comunque essere letture correlate interessanti.


Grazie, ma intendo diversi tipi di pattern, come Monad, Arrow, Applicative no GoF patterns.
Konstantin Solomatov

@KonstantinSolomatov: ho frainteso la tua domanda, scusa. Ho aggiunto alcuni riferimenti per monadi e frecce.
Riccardo T.

18

Jeremy Gibbons ha un blog Patterns in FP che è destinato a diventare più o meno il libro che stai chiedendo. Certo, non è ancora in grado di essere utile come potresti desiderare in questo momento, ma merita un po 'di incoraggiamento!

Nel frattempo, dico +1 per Typeclassopedia di Brent Yorgey. È davvero utile, e se ci sono parti successive che confondono, questo sito è un buon posto per andare in fondo. So che Brent lo tiene sotto controllo. Se non raggiunge i suoi lettori, dagli un aiuto.



5

Hai letto gli ultimi capitoli di Learn You a Haskell for Great Good ?

  • Il Capitolo 6 copre mappe e pieghe, che sono due dei più importanti "modelli di progettazione" nei linguaggi funzionali.

  • I capitoli 11-13 trattano i Funtori, i Funtori Applicativi e le Monadi, in quest'ordine. Questo è utile: molti tutorial introducono i funtori e poi le monadi, e poi aggiungono i funtori applicativi alla fine (se lo coprono del tutto). L'ordine in LYAH è migliore, perché spostandosi da Functors => Functors applicativi => Monadi si sposta gradualmente la scala della generalità e del potere.

  • Il Capitolo 14 copre Zipper: puoi effettivamente pensarli come classi contenitore con un puntatore a uno specifico pezzo di dati, il che significa che ottieni l'accesso O (1) e l'aggiornamento nella posizione del puntatore.

Non copre le frecce o le Comonad, che sono un argomento più avanzato in Haskell. Per capire come e perché usare le frecce o le comonadi dovresti sicuramente avere già una solida conoscenza delle monadi, quindi non penso che questo sia un problema - LYAH è fermamente rivolto all'estremità principiante del mercato Haskell.


1
Sì, ho letto il libro. Mi è piaciuto molto. Sfortunatamente non nasconde frecce e molti altri modelli avanzati. Voglio anche leggere di più su Monadi e Applicativi (ad esempio, LYHGG non copre la monade di continuazione).
Konstantin Solomatov
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.