Domanda

Ho un problema, che credo sia meglio risolto attraverso uno stile funzionale di programmazione.

Proveniente da un background molto imperativo, sono abituato a programmare progetti che coinvolgono diagrammi / descrizioni di classi, diagrammi di comunicazione, diagrammi di stato ecc. Questi diagrammi tuttavia implicano, o sono usati per descrivere, lo stato di un sistema e le varie effetti collaterali che le azioni hanno sul sistema.

Esistono serie standardizzate di diagrammi o simboli matematici utilizzati nella progettazione di programmi funzionali o tali programmi sono meglio progettati in un breve codice pseudo funzionale (dato che le funzioni saranno molto più brevi delle controparti imperative).

Grazie, Mike

È stato utile?

Soluzione

C'è un trucco segreto nella programmazione funzionale.

  1. È in gran parte apolide, quindi i diagrammi imperativi tradizionali non contano.

  2. Anche la maggior parte della normale notazione matematica di varietà da giardino è apolide.

Il design funzionale è più simile all'algebra di ogni altra cosa. Definirai le funzioni e mostrerai che la composizione di quelle funzioni produce il risultato desiderato.

I diagrammi non sono necessari perché la programmazione funzionale è in qualche modo più semplice della programmazione procedurale. È più simile alla notazione matematica convenzionale. Usa tecniche matematiche per mostrare che le tue varie funzioni fanno le cose giuste.

Altri suggerimenti

I programmatori funzionali si occupano più di scrivere equazioni che di diagrammi. Il gioco si chiama ragionamento equazionale e coinvolge principalmente

  • Sostituendo uguale a uguale

  • Applicazione di leggi algebriche

  • La prova occasionale per induzione

L'idea è di scrivere un codice davvero semplice che sia "manifestamente corretto", quindi utilizzare il ragionamento equazionale per trasformarlo in qualcosa di più pulito e / o che funzionerà meglio. Il maestro di questa arte è un professore di Oxford di nome Richard Bird.

Ad esempio, se voglio semplificare l'espressione dello Schema

(append (list x) l)

Sostituirò uguali per uguali come matti. Usando la definizione di list ottengo

(append (cons x '()) l)

Sostituendo il corpo dell'appendice I

(if (null? (cons x '())) 
    l
    (cons (car (cons x '())) (append (cdr (cons x '())) l)))

Ora ho queste leggi algebriche:

(null? (cons a b)) == #f
(car   (cons a b)) == a
(cdr   (cons a b)) == b

e sostituendo gli uguali con uguali ottengo

(if #f
    l
    (cons x (append '() l))

Con un'altra legge, (se #f e1 e2) == e2 , ottengo

(cons x (append '() l))

E se spendo di nuovo la definizione di append, ottengo

(cons x l)

che ho dimostrato è uguale a

<*>

Non so molto sulla programmazione funzionale, ma qui ci sono due cose in cui mi sono imbattuto

  • & # 955; (lambda) è spesso usato per indicare a la funzione
  • f & # 959; g è usato per indicare la funzione Composizione
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top