W matematyce zmienna oznacza, że możesz wstawić tam dowolną liczbę, a równanie nadal będzie prawdziwe:
root(square(x)) = abs(x)
W językach programowania tak nie jest: var może się zmienić. W Pythonie:
y = (x**2)**.5
x *= 2
assert y == abs(x)
zgłosi wyjątek, ponieważ x w ostatnim wierszu nie jest taki sam.
Czy istnieją języki programowania, które używają niezmiennych zmiennych?
Odpowiedzi:
Aby odpowiedzieć na pytanie tytułowe „Czy jakikolwiek język programowania używa zmiennych w matematyce?”: C, C #, Java, C ++ i inne języki C używają zmiennych w sposób, w jaki są używane w matematyce.
Musisz tylko użyć == zamiast =.
Jeśli wezmę twój oryginał
Następnie mogę przetłumaczyć to na C # bezpośrednio, bez żadnych zmian innych niż dla składni.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Spowoduje to ocenę wartości true dla dowolnej wartości x, o ile x podniesiony do kwadratu jest mniejszy niż maksimum dla używanego typu danych. (Java będzie rażąco podobna, ale uważam, że przestrzeń nazw Math jest nieco inna)
Następnego bitu nie uda się skompilować w języku C #, ponieważ kompilator jest wystarczająco inteligentny, aby wiedzieć, że nie mogę przypisać powrotu jednej operacji do innej.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
Niezmienność nie ma z tym nic wspólnego. Nadal musisz przypisać wartość w niezmiennym języku i jest całkiem możliwe, że dany język zdecyduje się to zrobić, używając = jako operatora.
Co więcej, ta pętla będzie działać do wyczerpania dopuszczalnych wartości x i uzyskania wyjątku dotyczącego przepełnienia:
Dlatego matematycy nienawidzą używania = do przypisania. To ich myli. Myślę, że to doprowadziło cię do pomieszania się. Weź swój przykład
Kiedy zamieniam to w algebrę, otrzymuję to:
abs (2x) = root (x ^ 2)
Co oczywiście nie jest prawdą dla wartości innych niż 0. Niezmienność pozwala jedynie uniknąć błędu zmiany wartości x, gdy dodasz dodatkowe kroki między oceną lewej i prawej strony pierwotnego równania. To tak naprawdę nie zmienia sposobu oceny wyrażenia.
źródło
Czysto funkcjonalne języki programowania, takie jak Haskell , wymuszają niezmienne zmienne. Lubię jednak nazywać je identyfikatorami, a nie zmiennymi.
źródło
=
Oznaczenie używane w językach programowania jest mylące.<-
, co oznacza „zapisz”, a nawet COBOLMOVE
.Jako dodatek, Prolog używa zmiennych takich jak matematyka: Zmienne nie mogą się zmieniać, a silnik Prolog wypełni zmienne, aby sprawdzić, czy istnieją rozwiązania.
Curry to także mieszanka Haskell i Prolog.
źródło
C, C ++ i Objective-C mogą określać niezmienność argumentów funkcji (i metody), a także innych zmiennych (identyfikatorów) za pomocą kwalifikatora typu „const”.
źródło
Można również symulować niezmienność w Pythonie, nie zezwalając na aktualizacje klas. Jak stwierdzono wcześniej, najbardziej czyste funkcjonalne języki programowania wymuszają niezmienność. Clojure to najnowszy dodatek do platformy JVM (Clojure to dialekt LISP)
W Scali (także języku JVM ) unifikator zadeklarowanych zmiennych pomocniczych OO i FP
val
jest niezmienny. Ekspresja Scali i obsługa hybryd OO / FP sprawia, że wygląda podobnie do Mathematica . ( Akka to framework, który dodaje funkcjonalność Erlang OTP i Clojure, taką jak STM .. do Scala i Java.) LACASA dodaje system typów i model programowania w celu wymuszenia dyscypliny zdolności obiektowych w Scali oraz zapewnienia unikalnych odniesień do obiektów. ( kod ) ( podstawy teoretyczne )W Javie zadeklarowana zmienna
final
jest niezmienna, a biblioteki Java, takie jak Google Guava, zawierają niezmienne biblioteki zbiorów. JavaString
są również zawsze niezmienne.źródło