programmazione funzionale con oggetto di richiesta mutante

3

In seguito utilizza il codice JavaScript ma F # viene taggato per l'input dai programmatori funzionali.

Capisco che nella programmazione funzionale non dovremmo mutare lo stato o i parametri in ingresso, ma sono confuso sul modello di richiesta formale quando si tratta di programmazione funzionale.

Il modello di richiesta formale è costituito da un oggetto con parametri di input e di output nello stesso oggetto.

La funzione cerca il sottoinsieme associato di parametri di input e popola il campo risultato associato. L'oggetto richiesta viene successivamente passato ad altri oggetti in cui ogni funzione aggiorna o decora il risultato formando quindi una pipeline.

In altre parole, l'oggetto richiesta viene popolato mentre passa attraverso la pipeline e ogni funzione successiva dipende dal risultato dell'operazione precedente.

ad esempio nel contesto del seguente codice Javascript.

var request = {
    publicationId: "1234",
    permissions: [] // string array
    schema: null
    // a lot more other input and output params
}

la seguente funzione legge publicationId & aggiorna permissions

authorization.requestPermissions(request);

la seguente funzione legge publicationId , permissions (dalla precedente chiamata) & popola schema

article.create(request);
article.upload(request); // uses updated schema from 'article.create'
article.publish(request); // uses update schema from 'article.upload'

Ogni operazione successiva dipende dal risultato dell'operazione precedente.

qui entrambi permissions e schema vengono emessi

console.log(request.permissions)
console.log(request.schema)

La domanda è, sta violando la programmazione funzionale?

Cosa potrei cambiare in questo codice per rendere il modello di richiesta formale più funzionale alla programmazione.

    
posta Devyiweid 02.05.2017 - 00:44
fonte

1 risposta

0

Questo modello non sarebbe considerato un modello accettabile nella programmazione funzionale; in effetti, in un linguaggio di programmazione funzionale pure sarebbe piuttosto difficile implementarlo come descriveresti.

Per produrre una pipeline di processori per alcune richieste di input in uno stile funzionale, si utilizzano le funzioni che accettano la richiesta nel proprio input e restituiscono la richiesta modificata come output. Sarebbe anche comune usare la tipizzazione statica per garantire che siano stati eseguiti gli aggiornamenti necessari prima che venga chiamata una funzione che si basa su di essi. In Haskell, il tuo esempio probabilmente finirà per sembrare qualcosa del tipo:

data Publication = Publication Int
data PublicationPerm = PublicationPerm Int [String]
data PublicationPermSchema = PublicationPermSchema Int [String] Schema

requestPermissions :: Publication -> PublicationPerm
requestPermissions (Publication id) = PublicationPerm id perms
       where perms = ... whatever code is needed to calculate permissions ...

createArticle :: PublicationPerm -> PublicationPermSchema
createArticle (PublicationPerm id perms) = PublicationPermSchema id perms schema
       where schema = ... whatever code is needed to calculate schema ...

logArticle :: PublicationPermSchema -> IO PublicationPermSchema
logArticle (PublicationPermSchema id perms schema) = do
        writeLogLine perms
        writeLogLine schema
        return (PublicationPermSchema id perms schema)

pipeline :: Publication -> IO PublicationPermSchema
pipeline = requestPermissions >>> createArticle >>> logArticle

Si noti che ciascuna funzione accetta un input e restituisce un nuovo oggetto che contiene anche le informazioni aggiuntive che ha calcolato. La pipeline alla fine stringe ciascuna funzione in una funzione combinata che esegue tutte le azioni.

La traduzione in Javascript perde la garanzia statica che la pipeline generi le informazioni richieste nell'ordine corretto, ma può essere eseguita. Sarebbe simile a questo:

requestPermisions = pub => ({ id: pub.id; perms: ... calculate permissions here ... })
createArticle = pub => ({ id: pub.id; perms: pub.perms; schema: ... })
logArticle = pub => { console.log (pub.perms); console.log (pub.schema); return pub; }
pipeline = pub => logArticle(createArticle(requestPermissions(pub)))
    
risposta data 02.05.2017 - 01:26
fonte

Leggi altre domande sui tag