在Scheme中,+, - ,*,/等程序适用于不同类型的数字,但我们没有看到任何其他通用程序。
例如,length仅适用于列表,因此需要vector-length和string-length。
我想这是因为该语言并没有真正提供任何机制来定义泛型过程(当然除了cond),比如Haskell中的“类类”或标准化的对象系统。
是否有一种惯用的方案来处理我不知道的通用程序?
答案 0 :(得分:2)
请记住,所有“不同类型的数字”都是方案号(即(number? n)
等于#t
) - 这种行为实际上是有道理的。 +
,-
,*
,/
以及所有其他算术运算符仅对数字起作用(即使在其他语言中,它们也会被归类为不同的数字类型{{1} },int
,long
等...这是因为您无法在方案中明确声明数字类型。
如果你真的需要一个通用的解决方案,除了使用外部库之外,最简单的方法就是自己动手:
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))