casting - 在 SICP 中创建强制程序

标签 casting scheme lisp sicp

这是 SICP 关于强制的引用。本节讲的是普通数、有理数、复数的算术包,以及对它们进行跨类型运算(如普通数加复数)。

This coercion scheme has many advantages over the method of defining explicit cross-type operations, as outlined above. Although we still need to write coercion procedures to relate the types (possibly N^2 procedures for a system with N types), we need to write only one procedure for each pair of types rather than a different procedure for each collection of types and each generic operation.

我对这条线感到困惑:

“对于具有 N 种类型的系统,可能有 N^2 个过程”

我们以算术包为例。涉及两个普通数(scheme-number scheme-number)、两个有理数(rational rational)和两个复数(complex complex)的运算属于同一类型,因此不包括在强制转换程序中。

我们有三种类型,这些是我能想到的只有两个参数的强制过程。

(方案编号有理数) (方案编号复合体) (有理方案-编号) (理性情结) (复杂的方案编号) (复有理数)

这些不是 n^2 强制程序。这里只有 6 个强制程序,而不是 9 个。我想我根本没有真正理解这部分文本。有人可以解释我错过了什么吗?

最后,这里有一个关于这部分文本的脚注。

If we are clever, we can usually get by with fewer than N^2 coercion procedures. For instance, if we know how to convert from type 1 to type 2 and from type 2 to type 3, then we can use this knowledge to convert from type 1 to type 3. This can greatly decrease the number of coercion procedures we need to supply explicitly when we add a new type to the system.'

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

谁能更清楚地解释一下?

最佳答案

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

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

关于casting - 在 SICP 中创建强制程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35156320/

相关文章:

java - Java 中盒装类的类型转换?

database - Golang DB反/序列化方法(数据库/sql之上的sqlx)

recursion - 检查列表的反转是否与列表未更改相同?

c - 类型转换为不同的编译器提供不同的结果

stream - 在 Drracket 中获取 #stream 作为输出

scheme - 如何使用display输出评论

scheme - 如何计算 bool 列表中 true 元素的数量?

lisp - 使用用户输入 lisp 添加到全局符号列表

random - Common Lisp 随机骰子

mysql - 将字符串转换为 double (非十进制)