Come già detto Salil, i due sono concetti diversi:
Un flusso è una (potenzialmente infinito) elenco di valori, tipicamente, ma non necessariamente, calcolato in modo artificiale, ossia solo memorizzare qualche modo di calcolare i valori quando richiesto. C'è un sacco di esempi in giro che non comportano monadi in qualsiasi modo:
(define integers (cons-stream 1 (stream-map (lambda (x) (+ x 1)) integers))
E 'molto utile considerare anche finiti, precalcolate, liste come flussi, dal momento che è possibile utilizzare ovunque una (potenzialmente o necessariamente) finita potrebbe essere usato un flusso lento.
Quindi, un flusso è qualcosa che ha un'operazione next: streamType -> (valueType streamType)
per ottenere il valore successivo e il flusso rimanente.
Monadi invece, sono meno di una struttura dati più un modo di scrivere codice sorgente combinando singoli comandi.
Probabilmente l'esempio più semplice è utile il “Forse Monade” - Non sono sicuro di quello che sarebbe simile nello Schema, mi spiace, ma l'idea è: Dato un elenco di calcoli (f g h)
e di un ingresso x
, eseguire la calcoli in ordine, quasi come se fosse dato (f (g (h x)))
, ma lasciare che ogni funzione fallisca con garbo: Se g
restituisce nil
, non invocare (f nil)
, ma invece, restituire immediatamente nil
.
È possibile, naturalmente, combinare le due cose in vari modi utili e calcolare i valori di flusso con monadi o incapsulare l'utilizzo di flussi, come i flussi di I/O che non sono esattamente seguendo le aspettative di programmazione funzionale in una monade (per evitare che il codice memorizzi un riferimento ad uno stato precedente del flusso), ma servono a scopi completamente diversi. Pensa al livello di astrazione (chiudi la copertina, non guardare l'interno): una monade, applicata alle funzioni, ti dà una funzione. Un flusso, d'altra parte, non è una funzione più elevata, ma un elenco di valori.
Ovviamente, la funzione definita da (o restituita da, a seconda del punto di vista dell'utente) la monade può essere un'implementazione di un flusso e anche i valori estratti da un flusso possono essere monadi. Ma come puoi vedere sopra, ci sono monadi che implementano cose completamente diverse dai flussi. Se ci sono flussi non implementati come monadi probabilmente dipende solo da cosa usi esattamente il termine. Devo confessare che non sono sicuro al momento se i flussi infiniti si qualificano correttamente come monadi; gli elenchi finiti ovviamente lo fanno.
Per quanto ho capito, i flussi di Scheme sono valori pigri mentre le Monade sono concatenazioni personalizzate di calcoli. – Salil
Gli stream sono esattamente liste pigre. In che modo i "valori pigri" possono essere presentati senza monade o ancora liste pigre o qualcosa del genere? Non confondere i "valori pigri" con variabili funzionali immutabili. Bene, e la "concatenazione personalizzata dei calcoli" ha corrispondenza uno-a-uno con "anche flussi"? – cofp
Bene. Confronta le definizioni sia di "even stream" che di monadi. E anche i loro assiomi. Come so, ogni flusso può essere espresso tramite una monade. È vero che ogni "valore" o "computazione" monadico può essere espresso attraverso un "flusso uniforme"? C'è qualche limite? – cofp