【问题标题】:Creating coercion procedures in SICP在 SICP 中创建强制程序
【发布时间】: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 类型的系统”中有“可能”。

标签: casting scheme lisp sicp


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-12
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多