Одна вещь, которую я не вижу в явном виде (хотя и намекает на это), заключается в том, что квадратный корень можно рассматривать как «производную» операцию: если реализация не предоставляет ее нам, мы можем написать нашу собственную.
Поскольку вопрос помечен языковым дизайном, мы могли бы рассмотреть некоторые не зависящие от языка описания. Хотя многие языки придерживаются разных принципов, в парадигмах очень распространено использование инкапсуляции для сохранения инвариантов; т.е. чтобы избежать значения, которое не ведет себя так, как подсказывает его тип.
Например, если у нас есть некоторая реализация целых чисел, использующая машинные слова, мы, вероятно, хотим как-то инкапсулировать представление (например, чтобы битовые сдвиги не могли изменить знак), но в то же время нам все еще нужен доступ к этим битам для реализации таких операций, как дополнение.
Некоторые языки могут реализовать это с помощью классов и частных методов:
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()
действительным?