【发布时间】:2016-02-02 14:38:27
【问题描述】:
这是 SICP 关于强制的引述。本节讨论包含普通数、有理数和复数的算术包以及对它们进行交叉类型运算(例如,将复数添加到普通数。)
与定义方法相比,这种强制方案有很多优点 如上所述的显式跨类型操作。虽然我们还是 需要编写强制程序来关联类型(可能是 N^2 N 种系统的程序),我们只需要写一个 每对类型的过程而不是不同的过程 每个类型的集合和每个泛型操作。
我对这一行感到困惑:
“对于一个有 N 种类型的系统,可能有 N^2 个过程”
我们以算术包为例。处理两个常数(scheme-number scheme-number)、两个有理数(rational有理数)和两个复数(complex complex)的运算是同一类型的,所以不包含在强制过程中。
我们有三种类型,这些是我能想到的只需要两个参数的强制过程。
(方案数有理数) (方案数复数) (有理方案数) (有理情结) (复杂方案编号) (复有理)
这些不是 n^2 强制程序。这里只有六个强制程序,不是9个。我想我根本没有真正理解这部分文字。有人可以解释我错过了什么吗?
最后,这里是关于这部分文本的脚注。
如果我们很聪明,我们通常可以用少于 N^2 的强制转换来解决问题 程序。例如,如果我们知道如何从类型 1 转换为 类型 2 和从类型 2 到类型 3,那么我们可以利用这些知识来 从类型 1 转换为类型 3。这可以大大减少 当我们添加一个新的时,我们需要明确提供的强制程序 输入系统。'
据我了解,如果我们可以将普通数转换为有理数,然后将该有理数转换为复数,我们就不需要将普通数转换为复数的过程。对吗?
谁能更清楚地解释一下?
【问题讨论】:
-
我认为报价也在计数(scheme-number scheme-number),(rationalrational)和(complex complex)。
-
@jkiiski 我也是这么想的。但是强制被定义为“将一种类型的对象转换为另一种类型的等效对象”,但是没有提到强制使用相同类型的两个参数并在不需要转换类型时忽略它。这是不言自明的吗?
-
我没有真正读过SICP所以我不能肯定,但我想作者指的是括号内的程序总量,而不是强制程序。可能他只是简化了它,因为说“N^2 程序”比说“N*(N-1) 强制程序加上相同类型的 N 程序”更容易。
-
@jkiiski 你可能会写,你所说的更有意义,为什么我们在“可能有 N ^2 程序的 N 类型的系统”中有“可能”。