Чи використовує будь-яка мова програмування змінні, оскільки вони є в математиці?


11

У математиці змінна означає, що ви можете помістити туди будь-яке число, і рівняння все одно буде істинним:

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

У мовах програмування це не так: var може змінюватися. На Python:

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

створить виняток, оскільки x в останньому рядку неоднаковий.

Чи існують мови програмування, які використовують незмінні змінні?


5
У математиці більшість рівнянь не є тотожностями. Наприклад, x ^ 2 + 5 = 6x є дійсним тоді і тільки тоді, коли x = 1 або x = 5. Рівняння, які дійсні для всіх значень у якомусь "Всесвіті" (наприклад, множини всіх реальних чисел), наприклад sin ( 2x) = 2 sin x cos x, називаються тотожностями .
Андреас Рейбранд

4
змінні математики! = змінні в мовах програмування. Я завжди думав, що вони також повинні мати різні імена, оскільки так багато людей плутаються, коли вони вносять заздалегідь уявлення про змінну математику до програмування.
Лі Лі Райан

1
Я думаю, що мета змінних математики не така, як у програмуванні. У математиці змінні являють собою невідоме значення, яке ви хочете знати, або місце у формулі, за якою ви ставите значення для отримання результату. Для загальних мов програмування сенс має лише другий випадок. Для першого випадку вам знадобиться таке програмне забезпечення, як Mathematica.
Паготті

Ні, вони цього не роблять. Спробуйте поставити будь-яке число на "x = 5".

Відповіді:


6

Щоб відповісти на ваше заголовкове запитання "Чи використовує будь-яка мова програмування змінні, як вони є в математиці?": C, C #, Java, C ++ та будь-яка інша мова стилю C використовують змінні таким чином, як вони використовуються в математиці.

Вам просто потрібно використовувати == замість =.

Якщо я візьму ваш оригінал

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

Тоді я можу перевести це безпосередньо на C # без будь-яких змін, крім синтаксису. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Це оцінить як істинне для будь-якого значення х до тих пір, поки х квадратик менший, ніж макс для типу даних, який ви використовуєте. (Java буде приблизно подібним, але я вважаю, що простір імен Math трохи інший)

Цей наступний біт не вдасться компілювати в C #, оскільки компілятор досить розумний, щоб знати, що я не можу призначити повернення однієї операції іншій операції.

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

Незмінюваність тут нічого спільного. Вам все одно потрібно призначити значення незмінною мовою, і цілком можливо, що дана мова може обрати це, використовуючи = як оператор.

Подальше доведення точки, ця петля буде працювати, поки вичерпаєте юридичні значення x та не отримаєте виняток переповнення:

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

Ось чому математики ненавидять використання = для призначення. Це їх бентежить. Я думаю, що це змусило вас заплутати себе. Візьміть свій приклад

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

Коли я перетворюю це на алгебру, я отримую таке:

abs (2x) = корінь (x ^ 2)

Що, звичайно, не вірно для значень, відмінних від 0. Незмінюваність позбавляє вас лише від помилки зміни значення x, коли ви додаєте додаткові кроки між оцінкою лівої та правої частини вихідного рівняння. Це насправді не змінює те, як ви оцінюєте вираз.


24

Чисто функціональні мови програмування, такі як Haskell , застосовують незмінні змінні. Мені подобається називати їх ідентифікаторами, а не змінними.


3
У Ерланге, який є нечистою функціональною мовою, змінні також незмінні.
sepp2k

Я не знаю надто багато Ерланга. Це атоми, правда? Чи дозволяє Erlang будь-яке змінне сховище змінної?
Ionuț G. Stan

3
@Ionut: Ні, атоми Ерланга - це ті, що називаються символами у ліпі та рубіні. Щодо вашого другого запитання: у ньому є словник процесу, який є глобальною (ну, на процес), що змінюється хеш-картою. Однак в моєму досвіді використовується дуже рідко. Крім того, єдиний спосіб порушити прозорість - це передача повідомлень.
sepp2k

4
Гм, я мушу навчитися собі якогось Ерланга :)
Ionuț G. Stan

як це відповідає на поставлене запитання?
гнат

5

=Знак використовується в мовах програмування вводить в оману. <-, що означає "магазин" або навіть COBOL MOVE.

Як додаток, Prolog використовує таку змінну, як математика: Змінні не можуть змінюватися, і движок Prolog заповнює змінні, щоб побачити, чи існують рішення.

Також Curry - це суміш Haskell та Prolog.


3

C, C ++ і Objective-C можуть визначати незмінність аргументів функції (та методу), а також інших змінних (ідентифікаторів) за допомогою класифікатора типу "const".


3

Ви також можете імітувати незмінність у Python, не допускаючи оновлень класів. Як було сказано раніше, більшість чистих функціональних мов програмування забезпечують незмінність. Clojure - недавнє доповнення до платформи JVM (Clojure - діалект LISP)

У Scala (також мові JVM ) уніфікатор змінних підтримки OO та FP, оголошених із val, незмінний. Експресивність Scala та гібридна підтримка OO / FP робить його схожим на Mathematica . ( Akka - це структура, яка додає Erlang OTP та Clojure функціональності, таких як STM .., до Scala та Java.) LACASA додає тип системи та модель програмування для забезпечення дисципліни в об'єкті дисципліни та надання унікальних посилань на об'єкти. ( код ) ( теоретичний фон )

У Java змінна, оголошена finalнезмінною, і бібліотеки Java, такі як Google Guava, включають незмінні бібліотеки колекцій. Java Strings завжди незмінні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.