(Prima di tutto "legare" in questione non ha nulla a che fare con std::bind
)È chiunque usando monadica programmazione bind-stile con Previsto <T>
ho guardato il Expected<T> talk e ho pensato che la presentazione sulla storia di questo alla tecnica mancava l'idea alla base di questa cosa in Haskell.
L'idea principale di Haskell è che non si "accederà mai" al valore di uno Expected<T>
. Quello che fai invece è passare un lambda allo Expected<T>
che verrà applicato o meno a seconda dello stato dello Expected<T>
.
Mi sarei aspettato che questo combinatore "bind" fosse il metodo principale che sarebbe stato utilizzato Expected<T>
, quindi devo chiedere se questo stile di programmazione è stato rifiutato per qualche motivo. Chiamerò che Combinator then
nel seguente:
template <class T> class Expected<T> {
....
template <class V, class F> Expected<V> then(F fun_) {
if (!valid()) {
return Expected<V>::fromException(this(??)); // something like that
}
return fun_(get());
}
}
Il punto di questo combinatore è a catena un elenco di funzioni in cui si non si necessità di verificare la presenza di errori, e dove la prima funzione che non riesce cortocircuiterà la valutazione.
auto res = Expected<Foo>::fromCode([]() { return callFun1(...); })
.then([](Baz& val) { return callFun2(..,val,..); })
.then([](Bar& val) { return callFun3(val,...); });
O questa sintassi che sta cominciando ad assomigliare l'operatore >>=
che viene utilizzato in Haskell.
auto res = []() { return callFun1(...); }
>> [](Baz& val) { return callFun2(..,val,..); }
>> [](Bar& val) { return callFun3(val,...); };
callFun1
restituisce una Expected<Baz>
, callFun2
restituisce un Expected<Bar>
, e callFun3
restituisce un Expected<Foo>
.
Come si può vedere, questo codice non controlla la presenza di errori. Gli errori interromperanno l'esecuzione, ma hanno ancora tutti i vantaggi di Expected<T>
. Questo è il modo standard per usare la monade Either
in Haskell.
Come ho detto, sicuramente qualcuno deve averlo guardato.
Modifica: Ho scritto tipi di reso errati per callFun {1..3}. Restituiscono Expected<T>
, non T
per vari valori di T
. Questo è in qualche modo il punto intero del combinatore then
o >>
.
Potrebbe ampliare la risposta con un esempio di best-possibile sintassi che si può ottenere in C++ per questo? – user239558
@user: 'some_expected.then (static_cast (& some_overloaded_function))', o con lambda, che, essendo monomorfici, possono essere visti come un cast sotto mentite spoglie. : | –
Xeo
questo è un po 'sopra la mia testa, ma tutti e due potresti voler controllare la lezione di bartosz: https://www.youtube.com/watch?v=ph7qt0pkPkc disclaimer: come molte volte quando si tratta di FP ho avuto una sensazione: o non è così speciale o mi manca qualcosa – NoSenseEtAl