Types 如何强制变量/输入在scheme中被视为不同的类型?

Types 如何强制变量/输入在scheme中被视为不同的类型?,types,type-conversion,scheme,Types,Type Conversion,Scheme,我正在尝试编写一个递归scheme函数,它解析字符串并返回字符串中所有数字字符的总和 我想我需要做这样的事情: (define (sumNums s) (if (null? s) 1 (if (char-numeric? (car s)) (+ ((car s) (sumNums (cdr s)))) (sumNums(cdr s))))) 每当我尝试以字符串作为参数运行它时,它都会给出一个错误,表示它需要一对。我如何在函

我正在尝试编写一个递归scheme函数,它解析字符串并返回字符串中所有数字字符的总和

我想我需要做这样的事情:

(define (sumNums s)
    (if (null? s) 1
        (if (char-numeric? (car s))
            (+ ((car s) (sumNums (cdr s))))
            (sumNums(cdr s)))))
每当我尝试以字符串作为参数运行它时,它都会给出一个错误,表示它需要一对。我如何在函数中指出我将给它一个字符串

此外,我无法将(car s)作为字符传递到(char numeric?)过程。仅使用一个简单的示例函数:

(define (isDigit c)
    (if(char-numeric? c)
        (display "is a number")
        (display "is not a number")))

(isDigit #\5)
如果如上所述,在函数调用中的输入之前显式地包含#\项,则它可以正常工作。但是函数中有没有办法强制它将输入解释为字符

(define (isDigit #\c)
    (if(char-numeric? c)
        (display "is a number")
        (display "is not a number")))
我尝试了上面的函数,它为unbound c提供了一个错误。这:

(isDigit #\(5))
也不起作用。所以在scheme中,我甚至不能强迫表达式(5)被解释为字符5


非常感谢您的帮助,我刚刚开始学习scheme,发现它非常不直观。

使用
string->list
将输入字符串转换为字符列表:

(define (sum-nums s)
  (let ((s (string->list s)))
    ...
您还需要将数字字符转换为十进制数字,您需要
((char->integer(cars))(char->integer\0))

编辑:对不起。我忽略了解决方案是递归的要求。您可能需要两个函数:

(define (sum-digits str)
  (sum-digits-aux (string->list str) 0))
第一个函数将字符串转换为字符列表,并调用起始和为0的辅助函数。第二个函数计算总和:

(define (sum-digits-aux cs sum)
  (cond ((null? cs) ...)
        ((char-numeric? cs) ...)
        (else ...)))
cond有三个子句:第一个子句终止递归并返回结果;第二个子句处理数字字符;第三个子句处理非数字字符


我让你来填这些点。

谢谢!我现在有了一个函数,可以扫描列表、检查字符和求和。如何将其与string->list函数相结合?我尝试将sumList函数放在您给出的let语句之后,得到一个错误,即预期的数据类型是一对:
(define(sumString)(let((s(string->list)))(if(null?s);;sumList函数体在自己调用0(if(char numeric?(car s))(+(-(char->integer(car s))(char->integer#\0))(sumList(cdr s)))(sumList(cdr sщщ)))