Sono sicuro che questo deve essere stato chiesto prima, ma non riesco a trovare da nessuna parte che in realtà risponde alla mia domanda, quindi scuse se ho semplicemente trascurato questo.
Attualmente sto imparando Haskell e mi piace il modo in cui bilancia la flessibilità consentendo la prototipazione rapida con purezza funzionale. Comunque sto cercando di capire le best practice. Una cosa di cui attualmente non sono sicuro è che tu abbia qualcosa di simile al seguente:
worlds :: [Foo] -> [World]
worlds [] = []
worlds fs = map toWorld fs
Questa funzione si basa su una funzione toWorld
che sarebbe stata definita altrove. La mia reazione immediata qui è che, poiché stai interagendo con qualcosa di "globale", è "corretto" fare questo? O faresti meglio a passare toWorld
nella funzione. Ora, dì che questo era Javascript, ovviamente potresti fare qualcosa del tipo:
function toWorld (foo) {
console.log('Side effect');
return foo; // The actual transformation is irrelevant
}
In questo caso, la mia comprensione è che la purezza di worlds
dipende semplicemente dalla purezza di toWorld
, e con un'implementazione come questa, worlds
diventerebbe impuro perché toWorld
ha un lato- effetto. Naturalmente in Haskell, dove tali effetti collaterali sono impossibili, si è certi che toWorld
sarà sempre puro, quindi questo "fa bene"? (Se ciò ha senso)
Inoltre, dì che toWorld
non solo ha preso un foo
, ma ha anche preso una costante che ha influenzato la trasformazione. Quindi avevi qualcosa come:
constant = 5
toWorld :: Int -> Foo -> World
toWorld k f = World k f -- Something, again, irrelevant
worlds :: [Foo] -> [World]
worlds [] = []
worlds fs = map (toWorld constant) fs
Questo è ora "impuro"? La costante dovrebbe essere qualcosa che viene sempre passato a worlds
? Perché sicuramente qualcuno potrebbe ridefinire constant
in qualcos'altro in fase di runtime e cambiare il funzionamento della funzione?
Spero che tutto ciò abbia un senso. Volevo ottenere alcuni pensieri. Qualsiasi input sarebbe apprezzato, non importa quanto piccolo. Cheers!