Qualche linguaggio di programmazione usa le variabili come sono in matematica?


11

In matematica, una variabile significa che puoi inserire qualsiasi numero lì e un'equazione sarà comunque vera:

root(square(x)) = abs(x)

Nei linguaggi di programmazione, non è così: un var può cambiare. In Python:

y = (x**2)**.5
x *= 2
assert y == abs(x)

solleverà un'eccezione, poiché x nell'ultima riga non è la stessa.

Esistono linguaggi di programmazione che utilizzano variabili immutabili?


5
In matematica, la maggior parte delle equazioni non sono identità. Ad esempio, x ^ 2 + 5 = 6x è valido se e solo se x = 1 o x = 5. Equazioni valide per tutti i valori in alcuni "universi" (come l'insieme di tutti i numeri reali), ad esempio sin ( 2x) = 2 sin x cos x, sono chiamati identità .
Andreas Rejbrand,

4
variabili in matematica! = variabili nei linguaggi di programmazione. Ho sempre pensato che anche loro avrebbero dovuto avere nomi diversi, dal momento che così tante persone sono confuse quando portano preconcetti sulla variabile in matematica alla programmazione.
Lie Ryan,

1
Penso che l'obiettivo delle variabili in matematica non sia lo stesso della programmazione. In matematica, le variabili rappresentano un valore sconosciuto che si desidera conoscere o un posto in una formula in cui si inserisce un valore per ottenere un risultato. Per i linguaggi di programmazione comuni, ha senso solo il secondo caso. Per il primo caso avrai bisogno di un software come Mathematica.
Pagotti,

No non lo fanno. Prova a mettere qualsiasi numero su "x = 5".

Risposte:


6

Per rispondere alla domanda del titolo "Qualche linguaggio di programmazione usa le variabili come sono in matematica?": C, C #, Java, C ++ e qualsiasi altro linguaggio in stile C usano le variabili nel modo in cui sono usate in matematica.

Devi solo usare == invece di =.

Se prendo il tuo originale

root(square(x)) = abs(x)

Quindi posso tradurlo in C # direttamente senza alcuna modifica se non per la sintassi. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Ciò valuterà vero per qualsiasi valore di x purché x al quadrato sia inferiore al massimo per il tipo di dati che si sta utilizzando. (Java sarà molto simile, ma credo che lo spazio dei nomi di Math sia un po 'diverso)

Il prossimo bit non riuscirà a compilare in C # perché il compilatore è abbastanza intelligente da sapere che non posso assegnare il ritorno di un'operazione a un'altra operazione.

Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)

L'immutabilità non ha nulla a che fare con questo. Devi ancora assegnare il valore in una lingua immutabile ed è del tutto possibile che una determinata lingua possa scegliere di farlo usando = come operatore.

A ulteriore dimostrazione del punto, questo ciclo verrà eseguito fino a quando non esaurirete i valori legali di x e otterrete un'eccezione di overflow:

 while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
        {
            ++x;
            System.Console.WriteLine(x);
        }

Questo è il motivo per cui i matematici odiano l'uso di = per il compito. Li confonde. Penso che questo ti abbia portato a confonderti. Prendi il tuo esempio

y = (x**2)**.5
x *= 2
assert y == abs(x)

Quando lo trasformo in algebra, ottengo questo:

abs (2x) = radice (x ^ 2)

Il che ovviamente non è vero per valori diversi da 0. L'immutabilità ti salva solo dall'errore di cambiare il valore di x quando aggiungi ulteriori passaggi tra la valutazione del lato sinistro e del lato destro dell'equazione originale. In realtà non cambia il modo in cui valuti l'espressione.


24

I linguaggi di programmazione puramente funzionali, come Haskell , impongono variabili immutabili. Mi piace chiamarli identificatori, invece di variabili.


3
In Erlang, che è un linguaggio funzionale impuro, anche le variabili sono immutabili.
sepp2k,

Non conosco troppo Erlang. Questi sono gli atomi, giusto? Erlang consente qualsiasi tipo di archiviazione mutevole di tipo variabile?
Ionuț G. Stan,

3
@Ionut: No, gli atomi di Erlang sono quelli che vengono chiamati simboli in lisp e ruby. Per quanto riguarda la tua seconda domanda: ha il dizionario dei processi, che è una mappa hash globale (bene, per processo), mutabile. Tuttavia, questo è usato molto raramente nella mia esperienza. A parte questo, l'unico modo per violare la trasparenza referenziale è il passaggio dei messaggi.
sepp2k,

4
Hm, dovrei imparare un po 'di Erlang :)
Ionuț G. Stan,

come risponde alla domanda posta?
moscerino

5

Il =segno usato nei linguaggi di programmazione è fuorviante. <-, che significa "store", o addirittura COBOL MOVEdovrebbe essere usato invece.

Inoltre, Prolog utilizza variabili come la matematica: le variabili non possono cambiare e il motore Prolog inserirà le variabili per vedere se esistono soluzioni.

Inoltre, Curry è un mix di Haskell e Prolog.


3

C, C ++ e Objective-C possono specificare l'immutabilità per argomenti di funzione (e metodo), così come altre variabili (identificatori), con il qualificatore di tipo "const".


3

Puoi simulare l'immutabilità anche in Python non consentendo aggiornamenti alle classi. Come affermato in precedenza, la maggior parte dei linguaggi di programmazione funzionale pura impone l'immutabilità. Clojure è una recente aggiunta alla piattaforma JVM (Clojure è un dialetto LISP)

In Scala (anche un linguaggio JVM ) un unificatore delle variabili di supporto OO e FP dichiarate con valsono immutabili. L'espressività di Scala e il supporto ibrido OO / FP lo rendono simile a Mathematica . ( Akka è un framework che aggiunge funzionalità OTP e Clojure di Erlang come STM .. a Scala e Java.) LACASA aggiunge il sistema di tipi e il modello di programmazione per imporre la disciplina della capacità degli oggetti in Scala e fornire riferimenti a oggetti unici. ( codice ) ( background teorico )

In Java una variabile dichiarata finalè immutabile e le librerie Java come Google Guava includono librerie immutabili di raccolte. Anche i Java Stringsono sempre immutabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.