惯用方案和通用编程,为什么只对数字?

时间:2010-04-22 14:32:06

标签: scheme generic-programming

在Scheme中,+, - ,*,/等程序适用于不同类型的数字,但我们没有看到任何其他通用程序。

例如,length仅适用于列表,因此需要vector-length和string-length。

我想这是因为该语言并没有真正提供任何机制来定义泛型过程(当然除了cond),比如Haskell中的“类类”或标准化的对象系统。

是否有一种惯用的方案来处理我不知道的通用程序?

5 个答案:

答案 0 :(得分:2)

请记住,所有“不同类型的数字”都是方案号(即(number? n)等于#t) - 这种行为实际上是有道理的。 +-*/以及所有其他算术运算符仅对数字起作用(即使在其他语言中,它们也会被归类为不同的数字类型{{1} },intlong等...这是因为您无法在方案中明确声明数字类型。

如果你真的需要一个通用的解决方案,除了使用外部库之外,最简单的方法就是自己动手:

float

答案 1 :(得分:1)

不,但你可以建立自己的。欢迎来到Scheme!

过去我使用Swindle来提供泛型函数。它与PLT Scheme捆绑在一起。它对我有用,但已经有几年了。现在可能还有其他选择。

答案 2 :(得分:1)

阅读SICP,第2.4和2.5节,其中介绍了通过将“标签”附加到数据对象可以对通用数据类型进行操作的过程的实现。这也是麻省理工学院视频系列的4-B课程。

答案 3 :(得分:1)

你真的想拥有一个对象系统。例如,您可能需要查看Tiny CLOS,这是Chicken Scheme的事实上的标准对象系统(请参阅reference manual),但似乎可用于大多数Scheme实现。< / p>

答案 4 :(得分:1)

最后,我在PLT计划中找到了一个非常简洁的解决方案:

(require (rename-in scheme [length list-length]))

(define length
 (λ (x)
  ((cond [(list? x) list-length]
         [(string? x) string-length]
         [(vector? x) vector-length]
         [else (error "whatever")]) x)))

(length '(a b c))
(length "abc")
(length #(1 2 3))