我正在通过阅读在线教程慢慢学习 Scheme 和修改 Haskell Write Yourself a Scheme in 48 Hours .我刚到this部分,向我们介绍了 Scheme 中的一些比较运算符。
("=", numBoolBinop (==)),
("<", numBoolBinop (<)),
(">", numBoolBinop (>)),
("/=", numBoolBinop (/=)),
(">=", numBoolBinop (>=)),
("<=", numBoolBinop (<=)),
("&&", boolBoolBinop (&&)),
("||", boolBoolBinop (||)),
("string=?", strBoolBinop (==)),
("string<?", strBoolBinop (<)),
("string>?", strBoolBinop (>)),
("string<=?", strBoolBinop (<=)),
("string>=?", strBoolBinop (>=)),
我有几个新手问题。 1. 为什么不同类型有单独的比较运算符,而不是一个泛型运算符或一个有很多重载的运算符? 2. 是否有可能有一个适用于所有类型的“通用”相等运算符,它是如何实现的?如果不是所有类型,那么至少是字符串和数字?
最佳答案
只回答第二个问题:不,不是。首先,eq?
与任何其他相等谓词之间存在差异,并且 eq?
几乎不可避免地对数字具有不可靠的行为。所以您至少需要 eq?
和一个“语义”相等谓词。但是这样的语义相等谓词是不存在的,因为语言不知道你想要什么语义。例如,这应该返回什么?
(let ([c (cons #f #f)])
(let ([a (cons c c)]
[b (cons (cons #f #f) (cons #f #f))])
(general-semantic-equal? a b)))
嗯,它应该返回 true 还是 false 取决于在程序中是否重要 a
的 car 和 cdr 是 eq?
而那些 b
则不是。如果不知道程序在做什么,就无法回答这个问题:相等谓词依赖于应用程序,该语言能做的最好的事情就是提供一个工具包,让您可以构建一个。
关于generics - 为什么字符串和数字有单独的比较函数/运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40079083/