在SICP中制定强制程序

时间:2016-02-02 14:38:27

标签: casting scheme lisp sicp

这是SICP关于强制的引用。本节讨论具有普通数字,有理数和复数的算术包,并对它们进行交叉类型操作(E.G.将复数加到普通数字上。)

  

这种强制方案与定义方法相比具有许多优点   如上所述,显式跨类型操作。虽然我们还在   需要编写强制程序来关联类型(可能是N ^ 2   对于具有N种类型的系统的程序,我们只需要编写一个   每对类型的过程而不是不同的过程   每个类型集合和每个通用操作。

我对此问题感到困惑:

“N类型系统的可能N ^ 2程序”

我们来看一下算术包的例子。使用两个普通数字(方案编号方案编号),两个有理数(理性有理数)和两个复数(复数复数)进行处理的操作是相同的类型,因此它们不包括在强制程序中。

我们有三种类型,这些是我只能用两个参数来思考的强制程序。

(计划数理性) (方案编号复杂) (合理的方案号码) (理性情结) (复杂方案编号) (复杂的理性)

这些不是n ^ 2强制程序。这里只有六个强制程序,而不是9.我认为我根本不理解这部分内容。有人可以解释我错过了什么吗?

最后,这是关于本部分内容的脚注。

  

如果我们聪明,我们通常可以通过少于N ^ 2的强制来获得   程序。例如,如果我们知道如何从类型1转换为   类型2,从类型2到类型3,然后我们可以使用这些知识   从类型1转换为类型3.这可以大大减少数量   当我们添加新的时,我们需要明确提供强制程序   键入系统。'

根据我的理解,如果我们可以将普通数转换为有理数,然后将该有理数转换为复数,我们就不需要将普通数转换为复数的过程。是吗?

任何人都可以更清楚地解释这个吗?

1 个答案:

答案 0 :(得分:2)

第一部分我理解为O(N ^ 2):如果有10种类型,我们需要大约100次操作(实际上,90次)。至于第二部分,你是对的:我们可以构建一个可组合的强制。但是,就我的想法而言,这需要建立一个有节点=类型和边缘=强制的有向图。然后找到正确的强制将涉及遍历图表以找到从一个节点到另一个节点的路径(不便宜!)。

PS。使事情变得更加复杂:复杂和理性都可以作为其他类型的容器,例如:理性的复合体,整数的复数,整数的理性(最简单的版本),多项式的合理性等。然后强制的问题变得更糟:考虑加1 + 2i,2/3和3.0 - 首先需要将所有东西都转换成他们各自的复杂表征(1 + 2i,2/3 + 0 / 1i,3.0 + 0.0i)然后才将其全部强制转移到复杂的浮动内...... TL; DR:数字强制是一场噩梦,我很高兴我自己不必这样做!