Ein Punkt, den ich nicht explizit erwähne (obwohl amon darauf anspielt), ist, dass die Quadratwurzel als "abgeleitete" Operation gedacht werden kann: Wenn die Implementierung dies nicht für uns bereitstellt, können wir unsere eigene schreiben.
Da die Frage mit Sprachdesign markiert ist, können wir eine sprachunabhängige Beschreibung in Betracht ziehen. Obwohl viele Sprachen unterschiedliche Philosophien haben, ist es in allen Paradigmen sehr verbreitet, die Kapselung zu verwenden, um Invarianten zu bewahren. dh zu vermeiden, einen Wert zu haben, der sich nicht so verhält, wie es der Typ vermuten lässt.
Wenn wir zum Beispiel eine Implementierung von Ganzzahlen mit Maschinenwörtern haben, möchten wir wahrscheinlich die Darstellung irgendwie kapseln (z. B. um zu verhindern, dass Bitverschiebungen das Vorzeichen ändern), aber gleichzeitig benötigen wir immer noch Zugriff auf diese Bits, um Operationen wie zu implementieren Zusatz.
Einige Sprachen können dies mit Klassen und privaten Methoden implementieren:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Einige mit Modulsystemen:
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
Einige mit lexikalischem Geltungsbereich:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
Und so weiter. Doch keines dieser Mechanismen sind für die Umsetzung Quadratwurzel benötigt: sie umgesetzt werden kann , die mit der öffentlichen Schnittstelle eines numerischen Typ, und daher macht es keinen Zugriff auf die verkapselte Implementierungsdetails müssen.
Daher hängt die Position der Quadratwurzel von der Philosophie / dem Geschmack der Sprache und des Bibliotheksdesigners ab. Einige können es als "innerhalb" der numerischen Werte festlegen (z. B. als Instanzmethode festlegen), andere können es auf der gleichen Ebene wie die primitiven Operationen festlegen (dies kann eine Instanzmethode bedeuten, oder es kann bedeuten, dass Sie außerhalb der numerische Werte, aber innerhalb desselben Moduls / derselben Klasse / desselben Namespaces (z. B. als eigenständige Funktion oder statische Methode), können einige diese in eine Sammlung von "Hilfsfunktionen" einfügen, andere können sie an Bibliotheken von Drittanbietern delegieren.
1.sqrt()
gültig?