Un punto que no veo mencionado explícitamente (aunque amon lo alude) es que la raíz cuadrada se puede considerar como una operación "derivada": si la implementación no nos la proporciona, podemos escribir la nuestra.
Dado que la pregunta está etiquetada con diseño de lenguaje, podríamos considerar alguna descripción independiente del lenguaje. Aunque muchos idiomas tienen filosofías diferentes, es muy común en todos los paradigmas utilizar la encapsulación para preservar invariantes; es decir, para evitar tener un valor que no se comporte como su tipo sugeriría.
Por ejemplo, si tenemos alguna implementación de enteros usando palabras de máquina, probablemente queremos encapsular la representación de alguna manera (por ejemplo, para evitar que los cambios de bit cambien el signo), pero al mismo tiempo todavía necesitamos acceso a esos bits para implementar operaciones como adición.
Algunos idiomas pueden implementar esto con clases y métodos privados:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Algunos con sistemas de módulos:
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
Algunos con alcance léxico:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
Y así. Sin embargo, ninguno de estos mecanismos es necesario para implementar la raíz cuadrada: puede implementarse utilizando la interfaz pública de tipo numérico y, por lo tanto, no necesita acceso a los detalles de implementación encapsulados.
Por lo tanto, la ubicación de la raíz cuadrada se reduce a la filosofía / gustos del lenguaje y del diseñador de la biblioteca. Algunos pueden optar por ponerlo "dentro" de los valores numéricos (por ejemplo, convertirlo en un método de instancia), algunos pueden optar por ponerlo al mismo nivel que las operaciones primitivas (esto puede significar un método de instancia, o puede significar vivir fuera del valores numéricos, pero dentro del mismo módulo / clase / espacio de nombres, por ejemplo, como una función independiente o método estático), algunos podrían optar por ponerlo en una colección de funciones "auxiliares", algunos podrían optar por delegarlo en bibliotecas de terceros.
1.sqrt()
valido?