Functional programming 向Racket中新定义的列表添加元素

Functional programming 向Racket中新定义的列表添加元素,functional-programming,scheme,racket,dot-product,Functional Programming,Scheme,Racket,Dot Product,一般来说,我对Racket和函数式语言都是新手。现在,我只是想在列表中添加一些项目。这些概念有点混乱,不确定我的代码为什么不能工作 我正在尝试做点积计算 我有一个名为“dProduct”的函数,它获取两个列表(a和B),并将其中的每个对应元素相乘 ;function takes dot product (define (dProduct A B) (define C '()) ; define list to store the multiplied element

一般来说,我对Racket和函数式语言都是新手。现在,我只是想在列表中添加一些项目。这些概念有点混乱,不确定我的代码为什么不能工作

我正在尝试做点积计算

我有一个名为“dProduct”的函数,它获取两个列表(a和B),并将其中的每个对应元素相乘

    ;function takes dot product
    (define (dProduct A B)

      (define C '()) ; define list to store the multiplied elements

      ;multiply ea lists elements
      (for ([i A] [j B])
        (display (* i j))   ;THIS WORKS
        (cons (* i j) C)    ;APPARENTLY DOESN'T WORK
      )

      ;THIS FOR LOOP DISPLAYS NOTHING
      ;display the new list "C"
      (for ([k C])
        (display k)
      )

    )

我不明白为什么我不能使用cons将新的乘法元素预先添加到我的新列表“C”中。我错过了什么?一切都很好。想弄明白这一点,这样我就可以完成这个功能:)任何帮助都将是伟大的。谢谢

列表是不可变的,
cons
不会将元素前置到现有列表中。相反,它会生成一个新的列表,其中元素的前缀为:

> (define x '(2 3))
> (cons 1 x)
'(1 2 3)
> x
'(2 3)
由于您的问题已标记,我假设您可能想知道如何在功能上做到这一点,而函数式编程通常不鼓励变异值或绑定

您应该在功能上建立一个新的结构,而不是改变绑定。最简单的方法是将
for
的用法更改为
for/list
,这将生成一个返回值列表:

(define C
  (for/list ([i A] [j B])
    (* i j)))
对于该程序,您可以使用更高阶的函数
map
,使其更加简单,当提供多个列表参数时,该函数的作用类似于“zip”:

(define C (map * A B))

由于的
总是返回
#
,因此它只对产生副作用有用,在函数式编程中,通常会尝试将副作用降至最低。因此,您可能会发现,
For/list
For/fold
在惯用的球拍中实际上比普通的
For
有用得多。

列表是不可变的,
cons
不会在现有列表中预先添加元素。相反,它会生成一个新的列表,其中元素的前缀为:

> (define x '(2 3))
> (cons 1 x)
'(1 2 3)
> x
'(2 3)
由于您的问题已标记,我假设您可能想知道如何在功能上做到这一点,而函数式编程通常不鼓励变异值或绑定

您应该在功能上建立一个新的结构,而不是改变绑定。最简单的方法是将
for
的用法更改为
for/list
,这将生成一个返回值列表:

(define C
  (for/list ([i A] [j B])
    (* i j)))
对于该程序,您可以使用更高阶的函数
map
,使其更加简单,当提供多个列表参数时,该函数的作用类似于“zip”:

(define C (map * A B))

由于
总是返回
#
,因此它只对产生副作用有用,在函数式编程中,通常会尝试将副作用降至最低。出于这个原因,你可能会发现,
For/list
For/fold
在惯用球拍中实际上比普通的
For
更有用。

当前的
C
list必须被赋予
(cons(*i j)C)
的新值,这可以通过
set来实现

(define (dProduct A B)

  (define C '()) 

  (for ([i A] [j B])
    (displayln (* i j))          
    (set! C (cons (* i j) C)))   ; NOTE set! HERE.

  (for ([k C])
    (displayln k)))

注意,
set的使用,在这里,
for/list
是实现所需结果的更好方法。

当前的
C
列表必须被赋予新的
(cons(*i j)C)
,这可以使用
集合来完成

(define (dProduct A B)

  (define C '()) 

  (for ([i A] [j B])
    (displayln (* i j))          
    (set! C (cons (* i j) C)))   ; NOTE set! HERE.

  (for ([k C])
    (displayln k)))
注意,
set的使用,而
for/list
是在此处实现所需结果的更好方法。

免费计划书:(也链接到DrRacket的内置帮助,它本身非常优秀)。免费计划书:(也链接到DrRacket的内置帮助,这本身就很好)。