Modelli mentali o metafore del mondo reale per la programmazione funzionale

16

Qualcuno ha un buon modello mentale o una metafora per la programmazione funzionale che fa riferimento a qualcosa nel mondo reale?

La programmazione orientata agli oggetti intuitivamente ha senso per me. Ci sono cose che hanno proprietà e talvolta possono anche fare cose o eseguire calcoli sulle loro proprietà (metodi). (Es: Car, Shape, Cat).

Gestisco la programmazione funzionale senza alcuna cattiva volontà e non mi interessa un dibattito sulle virtù dei due. Ho solo bisogno di una metafora o di un modello mentale con cui lavorare con la programmazione orientata agli oggetti.

Quali sono alcuni buoni modelli mentali o metafore del mondo reale per la programmazione in un paradigma funzionale? C'è qualcosa nelle funzioni composte da funzioni di elaborazione delle funzioni che lasciano uno senza un punto fermo in cui stare e cogitare.

    
posta Guido Anselmi 18.06.2014 - 16:54
fonte

8 risposte

32

La programmazione funzionale consiste nell'incollare insieme funzioni più piccole per ottenere i risultati. Un modello mentale decente (almeno per me) è una catena di montaggio. Ogni funzione che viene composta è un ulteriore passaggio nel processo di assemblaggio. Considera questa funzione qui:

smallest  = head . sort

In Haskell, questa funzione restituirà l'elemento più piccolo in una lista. La catena di montaggio ordina innanzitutto l'input, quindi restituisce il primo elemento (supponendo che sia ordinato almeno al massimo). Se si desidera ottenere solo il valore minimo più piccolo, è possibile modificare la catena di montaggio in modo che assomigli al seguente:

smallestEven = head . sort . filter even

È solo un altro passo sul nastro trasportatore.

In poche parole, le funzioni descrivono solo i passaggi necessari per convertire l'input non elaborato (le parti) nel bene elaborato (l'output).

    
risposta data 18.06.2014 - 17:05
fonte
18

Does anyone have a good mental model for functional programming?

Matematica. La programmazione funzionale è ispirata e modellata sulla matematica. Le funzioni matematiche non hanno stato, non hanno effetti collaterali, ecc. E così è con FP. Se pensi a FP in termini di funzioni matematiche piuttosto che a un approccio in stile OO "come faccio a questo", sarai in buona forma. Se provi a portare la sensibilità OO a FP, però, nuoterai contro corrente.

    
risposta data 18.06.2014 - 17:00
fonte
16

Che ne pensi di un libro a fogli mobili ?

In un libro a fogli mobili ogni pagina rappresenta il mondo così com'è in un momento nel tempo. Nel nostro programma il mondo è rappresentato come una struttura di dati composta (ad esempio abbiamo una banana che è nella mano di un gorilla che si trova in un albero che si trova in una giungla). Ogni pagina successiva avanza la storia modificando leggermente la rappresentazione precedente. In FP, strutture di dati persistenti sono state progettate per riutilizzare in modo efficiente strutture precedenti in modo che una modifica fornisca solo un delta e non una nuova versione completamente nuova.

Ciò che potrebbe non essere ovvio è che una pagina del nostro libro a fogli mobili rappresenterebbe anche beni immateriali. Ad esempio, se il gorilla lascia cadere la banana, potremmo iniziare ad applicare gli effetti della gravità sulla sua decente e accelerazione verso il pavimento della giungla. Per ovviare a questo dovremmo attribuire attributi come velocità e traiettoria alla nostra banana.

Nel nostro programma ci sarebbe una funzione che accetta una pagina di flip book (ovvero lo stato del mondo) come argomento e produce una nuova pagina . In questo modo la nostra storia viene raccontata senza mai realmente cambiare lo stato degli oggetti esistenti. Sostituiamo semplicemente ogni pagina con una nuova utilizzando quello che è effettivamente un calcolo.

    
risposta data 18.06.2014 - 19:44
fonte
3

relazioni.

Amico: Dato due persone, una relazione di amicizia segue queste leggi generali

  1. Abbi buona volontà l'uno verso l'altro
  2. Pensa che l'un l'altro è loro un amico (quindi le leggi devono essere soddisfatte da entrambi i membri in questa relazione)
  3. Gode di passare del tempo l'un l'altro

Monoid: dati più elementi e una funzione che prende 2 degli elementi e restituisce 1, una relazione monoidale segue queste leggi generali

  1. C'è uno di quegli elementi (solo uno, chiamato identità) che ha passato alla funzione con qualsiasi altro elemento assicurerà che la funzione restituisca sempre l'elemento altro (0 + 1 = 1, quindi 0 è l'identità quando gli oggetti sono numeri e la funzione è aggiunta)
  2. La funzione non può operare o restituire elementi non presenti nel set con una relazione monoidale con
  3. La funzione è associativa e può essere utilizzata con gli oggetti in un modo un po 'indipendente dall'ordine, questo significa a * (b * c) = (a * b) * c che dice che puoi moltiplicare a dal risultato di b * c o c dal risultato di un * b e il risultato sarà lo stesso per prima.

La programmazione funzionale è tutta una questione di generalizzazioni, l'amicizia è una relazione molto generale che può essere vista in numerosi scenari, ma in tutti i vari formati generalmente segue le leggi precedenti.

Riconoscendo le leggi che governano le relazioni tra le cose, puoi creare implementazioni generali che funzionano su qualsiasi formato di cose che ha quel tipo di relazione. Nella programmazione funzionale si tenta di identificare le relazioni tra le cose in modo che possano essere classificate e trattate in generale.

Vuoi una metafora dal mondo reale? Guarda come sono connesse le cose e cerca di identificare le leggi generali (come applicabili a più scenari in cui le cose diverse dalle leggi possono variare). Esiste una relazione tra un impiegato del registro e un acquirente in un negozio, ha alcune leggi generali, un software è stato sviluppato per facilitare gli obiettivi delle persone in quel rapporto generale nel modo dei sistemi POS. Allo stesso modo, quando inizi a vedere queste leggi generali che stabiliscono il modo in cui le cose sono correlate, puoi iniziare a fare affidamento sulle leggi di tali relazioni nella scrittura del tuo software piuttosto che sui particolari specifici di un'istanza di una relazione.

    
risposta data 18.06.2014 - 17:57
fonte
2

Ogni cosa è un valore e applicate le funzioni ai valori (che possono essere funzioni) per produrre nuovi valori, preferibilmente senza produrre effetti collaterali.

    
risposta data 18.06.2014 - 16:59
fonte
1

La cosa fondamentale da capire sulla programmazione funzionale è che tutto è un valore - anche il codice stesso è "valori".

Il miglior esempio di un semplice ambiente di programmazione funzionale è quello dello strumento di business preferito da tutti: il foglio di calcolo. Ogni cella nel foglio di calcolo è data o il risultato di una funzione. Cosa c'è di più, questa funzione non può andare fuori e modificare un'altra cella.

Quando si passa a una lingua funzionale, invece di una griglia cartesiana di A1 e B42 , la le funzioni hanno nomi. Questo è tutto ciò che è veramente.

Ci sono altri aspetti che si possono aggiungere oltre a questo ... ma questa è la programmazione funzionale al suo interno. Non è necessario preoccuparsi della struttura degli elenchi o del raggruppamento di cose. La programmazione funzionale riguarda il passaggio di un valore in una funzione e la restituzione di un valore senza che sia necessario effettuare il mucking altrove in memoria.

Ecco. La programmazione funzionale è un foglio di calcolo con i nomi anziché una griglia.

    
risposta data 21.06.2014 - 00:05
fonte
0

Puoi pensare alla programmazione funzionale come a comportamenti . Un programma è una descrizione del comportamento che si desidera che il computer esegua. Le funzioni sono l'unità di base del comportamento e la composizione delle funzioni è un modo per creare comportamenti più grandi da quelli più piccoli.

In OOP, un oggetto codice ha lo scopo di essere lo stato di un oggetto nel dominio del problema; cambia nel tempo per riflettere le modifiche in quell'oggetto dominio. In FP, un valore rappresenta lo stato di un oggetto dominio; non cambia mai, semplicemente crei valori diversi per rappresentare stati diversi.

Trovo che il modello funzionale sia un po 'più onesto su ciò che i computer stanno effettivamente facendo, rappresentando. Dopotutto, non posso semplicemente evocare un new Tesla() dal nulla. :)

    
risposta data 20.06.2014 - 02:39
fonte
-5

Le frasi sono più funzionali di quelle orientate agli oggetti, assumendo che tu le abbassi più o meno come il seguente ...

The brown cow is in the meadow across the deep river.

Quindi dobbiamo trovare le frasi di testa e poi il resto:

The cow (brown)
the meadow (across)
the river (deep)

In una volta:

sentence: The cow ((the meadow (the river (deep)) (across)) brown)

Parse tree:

|                     sentence
|                      /         
|                  The cow
|                 /       \
|            the meadow   brown
|            /         \
|      the river      across
|              \
|              deep

La parodia infetta il pensiero funzionale;

Cappelli a Gottlieb Frege del 1890, Alan Turing (entschiedungsprobleme) anni '30, Noam Chomsky (anni '60).

    
risposta data 18.06.2014 - 22:56
fonte

Leggi altre domande sui tag