Один момент, який я не бачу прямо згаданого (хоча Амон на це натякає), це те, що квадратний корінь можна розглядати як "похідну" операцію: якщо реалізація не надає цього нам, ми можемо написати своє.
Оскільки питання позначене мовним дизайном, ми можемо розглянути деякі мовно-агностичні описи. Хоча багато мов мають різні філософії, у парадигмах дуже часто застосовувати інкапсуляцію для збереження інваріантів; тобто, щоб уникнути значення, яке не веде себе так, як би запропонував його тип.
Наприклад, якщо у нас є деяка реалізація цілих чисел за допомогою машинних слів, ми, мабуть, хочемо якось інкапсулювати представлення (наприклад, щоб запобігти зміні бітів не змінити знак), але в той же час нам все ще потрібен доступ до цих бітів для здійснення операцій, таких як доповнення.
Деякі мови можуть реалізувати це за допомогою класів та приватних методів:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Деякі з модульних систем:
signature INT = sig
type int
val add : int -> int -> int
end
structure Word : INT = struct
datatype int = (* ... *)
fun add x y = (* Do something with the bits *)
fun getBits x = (* ... *)
end
Деякі з лексичною сферою:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
І так далі. Однак жоден із цих механізмів не потрібен для реалізації квадратного кореня: він може бути реалізований за допомогою загальнодоступного інтерфейсу числового типу, а значить, йому не потрібен доступ до інкапсульованих деталей реалізації.
Отже, розташування квадратного кореня зводиться до філософії / смаків мови та дизайнера бібліотеки. Деякі з них можуть вибрати , щоб покласти його «всередині» числові значення (наприклад , зробити це метод примірника), деякі з них можуть вибрати , щоб покласти його на тому ж рівні, що і примітивних операцій (це може означати метод примірника, або це може означати , що живуть за межами числові значення, але всередині одного і того ж модуля / класу / простору імен, наприклад, в якості окремої функції або статичного методу), деякі можуть вирішити помістити його в колекцію «помічницьких» функцій, а інші можуть вирішити делегувати його стороннім бібліотекам.
1.sqrt()
було б дійсним?