Ho due funzioni che sono una composizione di funzioni pure. La prima funzione prende un pacco, costruisce una casa su di esso, e scattare una foto per fare pubblicità in una rivista:Come evitare il calcolo non necessario quando si compongono funzioni pure in un linguaggio funzionale?
let buildAndAdvertiseHouse parcel =
parcel
|> inspect
|> buildWalls
|> buildRoof
|> takePhoto
|> advertise
La seconda funzione prende anche un pacco, costruisce una casa su di esso, e aggiunge una finitura touch to it:
È chiaro che le due funzioni sono pure pure, poiché sono una composizione di funzioni pure. Ora ho un pacco, diciamo niceParcel
e voglio applicare entrambe le funzioni ad esso. Tuttavia, voglio evitare che le prime tre sottofunzioni vengano calcolate due volte in quanto impiegano un grande tempo per il calcolo e sono condivise tra le due funzioni.
Come si effettua il refactoring del mio codice, quindi si evitano questi calcoli inutili, pur mantenendo queste belle funzioni pure che hanno un significato chiaro?
Se 'parcel' non è un tipo generico, quindi è possibile rendere il codice più idiomatico con' let buildAnd ... = inspect >> buildWalls >> ... >> advertise' (e con indentazione corretta) –
Per quanto riguarda la domanda, perché non dividere le due funzioni in tre funzioni denominate 'build',' advertise' e 'completeHouse'? –
Formano un'entità che può essere utilizzata in diverse parti del programma. Certo che possono essere divisi, ma poi questa entità è persa. In tal caso, se vuoi usarli, dovresti conoscere il funzionamento interno, vale a dire che è prima costruito e poi completato o pubblicizzato. Voglio evitare che tu debba conoscere il funzionamento interno. – Tuur