2

在 Scheme 中,像 +、-、*、/ 这样的过程适用于不同类型的数字,但我们看不到任何其他通用过程。

例如,长度仅适用于列表,因此需要向量长度和字符串长度。

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

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

4

5 回答 5

2

请记住,所有“不同类型的数字”都是方案数字(即(number? n)equals #t) - 这种行为实际上是有道理的。+, -, *,/和所有其他算术运算符仅对数字进行操作(即使在其他语言中它们会被归类为不同的数字类型int, long,float等...)这是因为您不能在其中显式声明数字类型方案。

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

(define org-length length)
(define (length x)
  (cond
    ((string? x) (string-length x))
    ((vector? x) (vector-length x))
    ; keep going ...
    (else (org-length x))))
于 2010-04-22T15:19:39.963 回答
1

最后,我在 PLT Scheme 中找到了一个非常巧妙的解决方案:

(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))  
于 2010-05-30T23:11:40.773 回答
1

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

过去我使用Swindle来提供通用功能。它与PLT Scheme捆绑在一起。它对我来说效果很好,但已经有几年了。现在可能还有其他选择。

于 2010-04-22T15:13:34.387 回答
1

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

于 2010-04-22T21:40:57.260 回答
1

你真的想要一个对象系统。例如,您可能想看看Tiny CLOS,它是 Chicken Scheme 的事实上的标准对象系统(参见参考手册),但似乎可用于大多数 Scheme 实现。

于 2010-04-23T10:49:37.060 回答