В математике переменная означает, что вы можете поместить туда любое число, и уравнение все равно будет верным:
root(square(x)) = abs(x)
В языках программирования это не так: переменная может измениться. В Python:
y = (x**2)**.5
x *= 2
assert y == abs(x)
вызовет исключение, поскольку x в последней строке не совпадает.
Существуют ли языки программирования, которые используют неизменяемые переменные?
Ответы:
Чтобы ответить на ваш заглавный вопрос «Использует ли какой-либо язык программирования переменные в математике?»: C, C #, Java, C ++ и любой другой язык стиля C используют переменные так же, как они используются в математике.
Вам просто нужно использовать == вместо =.
Если я возьму ваш оригинал
Затем я могу перевести это на C # напрямую, без каких-либо изменений, кроме как для синтаксиса.
Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)
Это будет иметь значение true для любого значения x, если x в квадрате меньше максимального значения для типа данных, который вы используете. (Java будет очень похожим, но я считаю, что пространство имен Math немного отличается)
Этот следующий бит не удастся скомпилировать в C #, потому что компилятор достаточно умен, чтобы знать, что я не могу назначить возврат одной операции другой операции.
Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)
Неизменность не имеет к этому никакого отношения. Вам все еще нужно присвоить значение на неизменяемом языке, и вполне возможно, что данный язык может сделать это, используя = в качестве оператора.
В дальнейшем подтверждая это, этот цикл будет работать до тех пор, пока вы не исчерпаете допустимые значения x и не получите исключение переполнения:
Вот почему математики ненавидят использование = для назначения. Это их смущает. Я думаю, что это привело вас в замешательство. Возьми свой пример
Когда я превращаю это в алгебру, я получаю это:
abs (2x) = корень (x ^ 2)
Что, конечно, неверно для значений, отличных от 0. Неизменность только спасает вас от ошибки изменения значения x, когда вы добавляете дополнительные шаги между оценкой левой и правой сторон исходного уравнения. Это на самом деле не меняет, как вы оцениваете выражение.
источник
Чисто функциональные языки программирования, такие как Haskell , поддерживают неизменяемые переменные. Мне нравится называть их идентификаторами, а не переменными.
источник
=
Знак используется в языках программирования вводит в заблуждение. вместо этого следует использовать<-
значение «store» или даже COBOLMOVE
.Кроме того, Prolog использует переменную, например, math: переменные не могут изменяться, и механизм Prolog заполняет переменные, чтобы посмотреть, существуют ли решения.
Кроме того, карри представляет собой смесь Haskell и Prolog.
источник
C, C ++ и Objective-C могут указывать неизменность для аргументов функции (и метода), а также других переменных (идентификаторов) с помощью квалификатора типа «const».
источник
Вы также можете симулировать неизменность в Python, не допуская обновления классов. Как указывалось ранее, самые чистые функциональные языки программирования обеспечивают неизменность. Clojure - это недавнее дополнение к платформе JVM (Clojure - это диалект LISP)
В Scala (также языке JVM ) объединитель переменных поддержки OO и FP, объявленных с помощью,
val
является неизменным. Выразительность Scala и гибридная поддержка OO / FP делают его похожим на Mathematica . ( Akka - это инфраструктура, которая добавляет функции Erlang OTP и Clojure, такие как STM .., в Scala и Java.) LACASA добавляет систему типов и модель программирования для обеспечения дисциплины возможностей объекта в Scala и для предоставления уникальных ссылок на объекты. ( код ) ( теоретическое обоснование )В Java объявленная переменная
final
является неизменной, а библиотеки Java, такие как Google Guava, включают в себя неизменяемые библиотеки коллекций. JavaString
также всегда неизменны.источник