Прозорість посилань (інформатика): відмінності між версіями

[неперевірена версія][неперевірена версія]
Вилучено вміст Додано вміст
ZéroBot (обговорення | внесок)
м r2.7.1) (робот додав: en:Referential transparency (computer science)
Немає опису редагування
Рядок 6:
 
Через те, що прозорість посилань вимагає однакового результату на однаковому вході в будь-який час, прозорий по посиланнях вираз є детермінованим за визначенням.
 
== Приклади й контрприклад ==
Якщо в виразі задіяні лише [[чиста функція|чисті]] функції, тоді вираз буде прозорим по посиланнях. Також, деякі нечисті функції можуть бути використані в виразі, якщо їх значення не впливають на значення виразу та їх [[побічний ефект (програмування)|побічні ефекти]] незначимі.
 
Візьмемо функцію, що не приймає параметрів і повертає дані введені з [[Клавіатура|клавіатури]]. Припустимо її виклик такий <code>GetInput()</code>. Значення повернуте функцією <code>GetInput()</code> залежить від того, що користувач друкує, отже різні виклики <code>GetInput()</code> з однаковими параметрами (порожній список) можуть вертати різні значення. Звідси, <code>GetInput()</code> ані детермінована, ані прозора по посиланнях.
 
Більш витончений приклад&nbsp;— функція, що використовує [[глобальна змінна|глобальну змінну]] (змінну з динамічною областю видності або лексичне [[Замикання (програмування)|замикання]]), щоб полегшити собі обчислення результату. Через те, що ця змінна не передається як параметр, але може бути змінена, результатом послідовних викликів можуть різнитись, навіть якщо параметри тотожні. (В чистому функціональному програмуванні використовується підхід єдиного присвоєння, тобто змінні після присвоєння їм значень стають незмінними об'єктами.)
 
Арифметичні операції прозрі по посиланнях: <code>5*5</code> можна замінити на <code>25</code>. В дійсності, всі функції прозорі по посиланнях в математичному сенсі: <code>sin(x)</code> прозора, бо вона завжди повертає те саме значення для певного <code>x</code>.
 
Присвоєння не прозоре. Наприклад, вираз на [[C (мова програмування)|C]] <code>x = x + 1</code> змінює значення надане <code>x</code>. Припустимо <code>x</code> початково має значення <code>10</code>, два послідовні обчислення виразу дають, відповідно, <code>11</code> і <code>12</code>. Звідси видно, що заміна <code>x = x + 1</code> на <code>11</code> або <code>12</code> надасть програмі іншого енсу, отже вираз не прозорий по посиланнях. Однак, виклик функції <code>int plusone(int x) {return x+1;}</code> ''є'' прозорим, бо вона явно не змінює x отже не має побічних ефектів.
 
В більшості мов, <code>print("Вітаю, світе!")</code> не прозора, бо заміна її на значення, що вона повертає змінює поведінку програми, бо «Вітаю, світе!» не надрукується.
 
<code>today()</code> теж не прозора, бо видає різні значення кожного нового дня.
 
 
[[Категорія:Функціональне програмування]]