> For the complete documentation index, see [llms.txt](https://mirkorap16.gitbook.io/clean-architecture/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mirkorap16.gitbook.io/clean-architecture/la-programmazione-funzionale.md).

# La programmazione funzionale

La programmazione funzionale è nata prima ancora che nascesse la programmazione in sè. Questo paradigma deriva fortemente dal lambda-calcolo inventato da Alonzo Church negli anni Trenta.

### Quadrati di interi

Immaginate di dover scrivere un programma per calcolare i quadrati dei primi 25 numeri interi. In PHP avreste qualcosa del genere:

```
<?php
for ($i = 0; $i < 25; $i++) {
    print_r(pow($i, 2) . PHP_EOL);
}
```

Usando un linguaggio funzionale come Clojure avreste:

```
(println (take 25 (map (fn [x] (* x x)) (range))))
```

Come potete vedere, a differenza del PHP in cui abbiamo dovuto utilizzare **una variabile mutabile**, ovvero `$i`, nell'esempio in Clojure tale variabile mutabile non esiste. Questo ci porta ad affermare una delle caratteristiche più importanti di questo paradigma: nei linguaggi funzionali, le variabili non variano!

### Immutabilità e architettura

Cos'è che rende così importante la programmazione funzionale? Ogni giorno affrontiamo problemi di concorrenza all'interno delle nostre applicazioni. Questi problemi sono dati proprio dalla mutabilità delle variabili. Se le variabili fossero immutabili, non dovremmo più preoccuparci dei problemi relativi all'aggiornamento concorrente dello stato e questo ne risulterebbe nell'avere delle applicazioni molto più solide. E' proprio questo il concetto che sta dietro la programmazione funzionale!

### L'origine degli eventi

Per fare un semplice esempio, immaginate di avere un'applicazione bancaria che conservi il saldo dei suoi clienti. Quello che deve fare è aggiornare lo stato del saldo ad ogni operazione di prelievo e deposito, ovvero ad ogni transazione. Ora immaginate che invece di memorizzare ogni volta lo stato del saldo, vada a memorizzarsi soltanto le transazioni. Ogni volta che un cliente vuole conoscere lo stato del suo saldo, basta sommare tutte le transazioni eseguite sul suo conto, dall'inizio dei tempi. Questo approccio, che non richiede alcuna variabile mutabile, si chiama **event sourcing**, e pur sembrando assurdo, in quanto man mano che passa il tempo il numero delle transazioni si accumulerebbe a tal punto da rendere la nostra operazione di calcolo del saldo più lenta, è perfettamente praticabile adottando delle "scorciatoie". Per esempio, possiamo salvare lo stato del saldo ogni mezzanotte, così da dover calcolare le transazioni solo a partire dalla mezzanotte. Applicando questo approccio, non avremmo più operazioni di cancellazione o aggiornamento. Le nostre applicazioni non saranno più CRUD (Create, Read, Update, Delete), ma solo CR (Create, Read). Questo è il modo in cui lavorano i sistemi di controllo versione come Git.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://mirkorap16.gitbook.io/clean-architecture/la-programmazione-funzionale.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
