我没有看到明确提到的一点(尽管阿蒙(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()
有效吗?