Functional programming 向Racket中新定义的列表添加元素
一般来说,我对Racket和函数式语言都是新手。现在,我只是想在列表中添加一些项目。这些概念有点混乱,不确定我的代码为什么不能工作 我正在尝试做点积计算 我有一个名为“dProduct”的函数,它获取两个列表(a和B),并将其中的每个对应元素相乘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
;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的使用强烈反对使用code>,在这里,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的使用强烈反对使用code>,而for/list
是在此处实现所需结果的更好方法。免费计划书:(也链接到DrRacket的内置帮助,它本身非常优秀)。免费计划书:(也链接到DrRacket的内置帮助,这本身就很好)。