Satu hal yang saya tidak lihat disebutkan secara eksplisit (walaupun amon menyinggung itu) adalah bahwa akar kuadrat dapat dianggap sebagai operasi "turunan": jika implementasi tidak menyediakannya untuk kita, kita dapat menulis milik kita sendiri.
Karena pertanyaan ini ditandai dengan desain bahasa, kami mungkin mempertimbangkan beberapa deskripsi agnostik bahasa. Meskipun banyak bahasa memiliki filosofi yang berbeda, sangat umum lintas paradigma untuk menggunakan enkapsulasi untuk melestarikan invarian; yaitu untuk menghindari memiliki nilai yang tidak berperilaku seperti yang disarankan oleh tipenya.
Sebagai contoh, jika kita memiliki beberapa implementasi bilangan bulat menggunakan kata-kata mesin, kita mungkin ingin merangkum representasi entah bagaimana (misalnya untuk mencegah pergeseran bit dari mengubah tanda), tetapi pada saat yang sama kita masih memerlukan akses ke bit tersebut untuk mengimplementasikan operasi seperti tambahan.
Beberapa bahasa dapat menerapkan ini dengan kelas dan metode pribadi:
class Int {
public Int add(Int x) {
// Do something with the bits
}
private List<Boolean> getBits() {
// ...
}
}
Beberapa dengan sistem modul:
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
Beberapa dengan lingkup leksikal:
(defun getAdder ()
(let ((getBits (lambda (x) ; ...
(add (lambda (x y) ; Do something with the bits
'add))
Dan seterusnya. Namun, tidak satu pun dari mekanisme ini diperlukan untuk mengimplementasikan akar kuadrat: ia dapat diimplementasikan menggunakan antarmuka publik dari tipe numerik, dan karenanya tidak perlu akses ke detail implementasi yang dienkapsulasi.
Oleh karena itu lokasi akar kuadrat datang ke filosofi / selera bahasa, dan perancang perpustakaan. Beberapa mungkin memilih untuk memasukkannya "dalam" nilai-nilai numerik (misalnya membuat metode contoh), beberapa mungkin memilih untuk meletakkannya pada tingkat yang sama seperti operasi primitif (ini mungkin berarti metode contoh, atau mungkin berarti hidup di luar yang nilai numerik, tetapi di dalam modul / kelas / namespace yang sama, misalnya sebagai fungsi mandiri atau metode statis), beberapa mungkin memilih untuk memasukkannya ke dalam koleksi fungsi "pembantu", beberapa mungkin memilih untuk mendelegasikannya ke perpustakaan pihak ketiga.
1.sqrt()
akan valid