2012-05-07 14 views
13

Esiste qualche differenza tra i flussi (liste pigre) e le monadi? Dal punto di vista concettuale e matematico, non dall'implementazione tecnica.Stream vs monadi

Oppure esiste biunique, corrispondenza uno-a-uno tra?

Più esattamente, come flussi indica "anche flussi" dal SRFI-41 della lingua Scheme.

È un'altra categoria rispetto alle monadi? Se sì, quale categoria è?

Maggio "anche i flussi" garantiscono il controllo degli effetti collaterali, come le monadi?

+0

Per quanto ho capito, i flussi di Scheme sono valori pigri mentre le Monade sono concatenazioni personalizzate di calcoli. – Salil

+0

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

+0

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

risposta

5

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.

+0

La tua risposta è molto più utile. E le obiezioni alla risposta precedente non erano contro ogni differenza. Era solo questione di trovare la differenza. Ma le obiezioni alla risposta precedente erano contro l'equazione dei "valori pigri" con le promesse di Scheme. E contro qualcos'altro, ma non contro nessuna differenza. – cofp

+0

Bene, solo nel testo della domanda c'era il suggerimento di non guardare "sotto la copertura". Quindi, qual è la differenza tra una "struttura dati" e un "modo di" fare qualcosa ("scrivere codice")? Dal punto di vista dell'astrazione dal tempo e dagli stati. Dire che qualcosa è più o meno una "struttura dati". E sono strutture "liste pigre" o solo una "via"? Perché l'affermazione che "gli stream sono esattamente elenchi pigri" era solo un'obiezione ai "valori pigri". Da ciò non segue che il flusso sia esattamente "strutture dati". – cofp

+0

I tuoi ragionamenti su una "funzione superiore" sono più forti IMHO. Anche se ha ancora bisogno di una dimostrazione che non c'è modo di usare "anche stream" come funzioni più alte. Quindi si dimostrerebbe che i flussi sono più restrittivi dei modad. Ma per dire che sono * completamente * diversi, non dimenticare che i flussi possono essere espressi attraverso le monadi. Quindi i flussi sono solo una sottocategoria di monadi. Ma questa sottocategoria è un "sub" rigoroso? O è solo un incrocio parziale? IMHO la domanda è aperta. – cofp