L'espressione computazionale è la stessa di monade?


22

Sto ancora imparando la programmazione funzionale (con f #) e di recente ho iniziato a leggere le espressioni di calcolo. Continuo a non comprendere appieno il concetto e una cosa che mi rende insicuro quando leggo tutti gli articoli riguardanti le monadi (la maggior parte di essi sono scritti sulla base di Haskell) è la relazione tra espressioni di calcolo e monadi.

Dopo aver scritto tutto questo, ecco la mia domanda (due domande in realtà):

Ogni espressione di calcolo di F # è una monade? Ogni monade può essere espressa con espressione di calcolo F #?

Ho letto questo post di Tomas Petricek e se lo capisco bene, afferma che le espressioni di calcolo sono più che monadi, ma non sono sicuro di interpretarlo correttamente.


@Raphael, posso chiederti qual è la ragione per rimuovere il tag lang?
Grzegorz Sławecki,

2
Dato che ci preoccupiamo dei concetti, cerchiamo di mantenere la maggior parte delle cose indipendenti dalla lingua qui. Non so che cosa fa la rimozione di F # alla domanda ( penso che se è importante che sia F #, la domanda è offtopica qui, ma è un caso limite) quindi rimuovo solo il tag F #. Regola empirica: F # non è un concetto CS, quindi non ha bisogno di un tag. (Sì, sono a conoscenza di altri tag PL e non mi piacciono neanche. Per alcune domande, la community ha deciso di garantire questi tag.)
Raphael

1
@Raphael Credo che la domanda sia davvero un caso limite. Qualcuno ha deciso di migrarlo qui, ma sembra che anche qui sia leggermente fuori tema. La domanda in sé è una specie di computer da allora, ma allo stesso tempo sia le risposte che la domanda sono specificamente correlate a f #. Capisco la tua regola empirica, grazie per il chiarimento.
Grzegorz Sławecki,

Risposte:


22

Innanzitutto, le espressioni di calcolo sono una caratteristica del linguaggio, mentre le monadi sono astrazioni matematiche, quindi da questo punto di vista sono cose completamente diverse .

Ma quella non sarebbe una risposta molto utile :-). Le espressioni di calcolo sono una funzione del linguaggio che ti dà una sintassi che può essere usata per programmare con calcoli (o tipi di dati) che hanno la struttura monadica, ma possono anche essere usati con altre strutture. Puoi leggere il mio documento sullo zoo delle espressioni di calcolo F # per maggiori dettagli, ma le espressioni di calcolo possono essere utilizzate con:

  • Monadi, ma anche monadi additive (ciò che gli Haskeller chiamano MonadPluso MonadOr)
  • Calcoli composti (ciò che gli Haskeller chiamano trasformatori di monade)
  • Calcoli monadici, ma che supportano altri costrutti F # come la gestione delle eccezioni
  • Monoidi (e un paio di variazioni senza legame monadico)
  • Funzionari applicativi (sebbene questo sia implementato solo in un'estensione di ricerca)

Quindi, le espressioni di calcolo sono certamente strettamente legate alle monadi, ma non sono strettamente legate a esse. Ciò è in contrasto, ad esempio, con la donotazione di Haskell , che è molto più strettamente legata alle monadi (anche se anche questo può essere usato con calcoli che non sono strettamente monadi matematicamente).


3
I trasformatori di monade sono un modo generico per convertire una monade in un'altra monade: le espressioni di calcolo F # supportano davvero solo l'implementazione diretta del / risultato / di quella trasformazione, piuttosto che la trasformazione stessa.
GS - Scusati con Monica il

1
@GaneshSittampalam - Sì, hai ragione. Il mio tentativo di semplificare non è stato molto utile qui :-). Le espressioni di calcolo possono darti una sintassi per lavorare con un calcolo che è il risultato dell'applicazione di un trasformatore di monade (con sintassi potenzialmente diversa per la monade sottostante e per la monade composta)
Tomas Petricek,

5

Puoi usare espressioni di calcolo per esprimere monadi. C'è un esempio qui . Inoltre, come hai notato, puoi usare espressioni di calcolo per molto più che semplici monadi. C'è una spiegazione estesa su come sono diversi qui . Qui non c'è spazio per spiegare correttamente la differenza, ma le espressioni di calcolo sono diverse dalle monadi in quanto riutilizzano la normale sintassi F # e hanno la possibilità di aggiungere ulteriori astrazioni. Una limitazione è che non è idiomatico (e difficile) scrivere un'espressione di calcolo polimorfica rispetto al tipo di calcolo.


1
Rendi la tua risposta più autonoma riassumendo almeno il materiale nelle pagine a cui ti colleghi. La tua risposta attuale sarà completamente priva di significato se i due link smettono di funzionare.
David Richerby,

2
Non sono sicuro di cosa stai parlando. Ho risposto esplicitamente alle domande e quindi ho fornito collegamenti a ulteriori informazioni se l'interessato è interessato. I collegamenti non sono necessari per rispondere alla domanda.
N_A,

1
Non riesco nemmeno a immaginare che i due link potrebbero mai smettere di funzionare :-)
Tomas Petricek,
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.