使用累加器连接数字列表

Using accumulator to concatenate a list of numbers

我正在尝试创建一个函数来将整数列表连接成一个 integer/string, 预期值:

(check-expect (concatNumbers (list 1 2 3 4)) 1234)
(check-expect (concatNumbers (list 0 4 3 2 1)) 04321)

我的函数:

(define (concatNumbers alon)
  (local
    ((define (inner list1 acc)
       (cond
         ((empty? list1) acc)
         (else
          ((string-append (number->string (first list1)) acc)
           (inner (rest list1) acc))))))
(inner alon "")))

但是有一个我无法理解的错误:

function call: expected a function after the open parenthesis, but received "3"

我试图找到以下值的测试:

(concatNumbers (list 1 5 7 8 9 3))

每个 cond 子句(我猜你使用的是中级学生语言)由两部分组成:

  • 一个测试表达式,它要么为真,要么为真,或者 else 总是为真;
  • 一个表达式,如果它是测试表达式为真的第一个子句,它将被计算。

那么,看看你的 else 子句:

(cond
  ...
  (else
   ((string-append (number->string (first list1)) acc)
    (inner (rest list1) acc))))

好的,表达式是

((string-append (number->string (first list1)) acc)
 (inner (rest list1) acc))

所以,如果这在语言中是合法的(在完整的 Racket 中),它的意思是:

  1. 评价(inner (rest list1) acc);
  2. 评估(string-append (number->string (first list1)) acc),在程序中有更好的结果;
  3. 对 (1) 产生的值调用 (2) 产生的过程。

这看起来不对,是吗?首先,(string-append ... ...) return 是什么意思?我的猜测是 'not a procedure'.

相反,您可能想使用附加的字符串作为其 acc 参数再次调用 inner

(你还必须做一些其他事情才能得到正确答案,但我会保留它,因为它很有趣。)