Functional programming 如何删除scheme中的括号?

Functional programming 如何删除scheme中的括号?,functional-programming,scheme,Functional Programming,Scheme,scheme中有一个函数,这个函数多次调用另一个函数,每次这个函数都将另一个函数的返回值附加到结果值上。 但最后我想得到这样一个结果:(abc),然而我得到这样一个结果:((a)(b)(c))我如何解决这个问题?我已经找过了,但找不到好的解决办法 我的小代码不是所有的 (append res (func x)) (append res (func y)) (append res (func z)) 我的代码是这样的 (define (check a ) '(1) ) (def

scheme中有一个函数,这个函数多次调用另一个函数,每次这个函数都将另一个函数的返回值附加到结果值上。 但最后我想得到这样一个结果:
(abc)
,然而我得到这样一个结果:
((a)(b)(c))
我如何解决这个问题?我已经找过了,但找不到好的解决办法

我的小代码不是所有的

(append  res  (func x))
(append  res  (func y))
(append  res  (func z))
我的代码是这样的

(define (check a )  
'(1)
)

(define bos '())
(define (func a)
(let loop1([a a] [res '()]) 
(cond 
[(eq? a '()) res] 
[else (let ([ x (check (car a))]) 
(loop1 (cdr a) (append  res (list x)))
)]
)
))

看来不是

(loop1 (cdr a) (cdr b) c (append  res (list x)))
你想要

(loop1 (cdr a) (cdr b) c (append  res x))
试试这个:

(define (func a)
  (let loop1 ([a a] [res '()])
    (cond 
      [(eq? a '()) res]
      [else
       (let ([ x (check (car a))]) 
         (loop1 (cdr a) (append res x)))])))
请注意,我所做的唯一更改(除了改进格式之外)是用
x
替换
(列表x)
。那就行了!或者,可移植性较差-您可以使用
append*
而不是
append

(append* res (list x))
作为旁注,您应该使用
(null?a)
测试列表是否为空。现在,如果我们使用问题中的示例代码测试该过程,我们将得到:

(func '(a b c))
=> '(1 1 1)

基本上,诀窍是使用
cons
而不是
list
。想象一下
(列表1 2 3 4)
,它与
(cons 1(cons 2)(cons 3(cons 4’(')))
相同。您是否看到每个部分是如何
(与此迭代元素相反(进一步递归))
如下所示:

(define (make-list n)
  (if (zero? n)
      '()
      (cons n (make-list (sub1 n)))))

(make-list 10) ; ==> (10 9 8 7 6 5 4 3 2 1)
通常,当您可以选择方向时,始终可以使用累加器使其尾部递归:

(define (make-list n)
  (let loop ((x 1) (acc '()))
    (if (> x n)
        acc
        (loop (add1 x) (cons x acc))))) ; build up in reverse!


(make-list 10) ; ==> (10 9 8 7 6 5 4 3 2 1)
这是一个通用的答案。应用于您的工作代码:

(define (func a)
  (let loop1 ([a a] [res '()]) 
    (cond 
      [(eq? a '()) (reverse res)] 
      [else 
       (let ([x (check (car a))]) 
         (loop1 (cdr a) (cons (car x) res)))])))

(func '(a b c)) ; ==> (1 1 1)

append
替换了
cons
,那么为什么不把
car
og您的结果放在列表的其余部分呢。因为您希望结果的顺序是I
反向
基本情况下的结果。(从结果看不出来,但我猜是因为您使用了ise
append

请发布一个简单的工作示例来演示您的问题。已编辑。我编辑我的代码,我的check func有时返回一个元素,有时返回一个列表,但我不想重复这些。我该怎么做呢?
append*
并没有包含在所有的方案中,而且您的用法相当于
(append res x)
。@IstvanChung很公平,它是固定的。