明示的に言及されていない点の1つは(amonがそれを暗示しているとしても)、平方根は「派生」操作と考えることができるということです。
質問には言語設計のタグが付けられているため、言語にとらわれない説明を検討する場合があります。多くの言語には異なる哲学がありますが、不変式を保存するためにカプセル化を使用することはパラダイム全体で非常に一般的です。すなわち、その型が示すように振る舞わない値を持つことを避けるため。
たとえば、マシンワードを使用した整数の実装がある場合は、おそらく何らかの方法で表現をカプセル化する必要があります(たとえば、ビットシフトが符号を変更するのを防ぐため)が、同時に、これらのビットにアクセスして、添加。
一部の言語では、クラスとプライベートメソッドでこれを実装できます。
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()
有効では?