Recursion 强制racket接受递归变量定义作为递归函数定义
为了好玩,我在Racket中创建了一系列函数,可以创建和组合其他函数 现在我已经根据它们定义了一个递归函数:Recursion 强制racket接受递归变量定义作为递归函数定义,recursion,functional-programming,racket,Recursion,Functional Programming,Racket,为了好玩,我在Racket中创建了一系列函数,可以创建和组合其他函数 现在我已经根据它们定义了一个递归函数: (define (my-flatten2 struct) ((<?> pair? (<+> append <m> (</> map my-flatten2) (<Y> car cdr)) list) struct)) (定义(my-2结构)
(define (my-flatten2 struct)
((<?> pair?
(<+> append <m>
(</> map my-flatten2)
(<Y> car cdr))
list)
struct))
(定义(my-2结构)
((一对?
(附加)
(地图my-2)
(汽车cdr)
(列表)
结构)
我首先尝试了这个,但没有成功(它在定义错误之前给了我一个不能引用的标识符):
(定义我的展平错误
(一对?
(附加)
(映射我的展平错误)
(汽车cdr)
(列表)
有人能解释为什么它不起作用,以及是否有办法修复它吗
记录在案
正在编写
创建一个函数,将函数列表应用于一个参数
部分适用
是选择
(define p (add1 p))
不起作用
在这种情况下,假设我的展平错误确实是一个函数,只需延迟计算我的展平错误
,就可以相当容易地解决您的问题:
(define my-flatten-error
(<?> pair?
(<+> append <m>
(</> map (lambda args
(apply my-flatten-error args)))
(<Y> car cdr))
list))
(定义我的展平错误
(一对?
(附加)
(地图(lambda args)
(应用我的展平错误参数)))
(汽车cdr)
(列表)
还可以使用宏隐藏lambda:
(define-syntax delay-fn
(syntax-rules ()
[(delay-fn f) (lambda args (apply f args))]))
(define my-flatten-error
(<?> pair?
(<+> append <m>
(</> map (delay-fn my-flatten-error))
(<Y> car cdr))
list))
(定义语法延迟fn
(语法规则()
[(延迟fn f)(lambda参数(应用f参数))])
(定义我的展平错误
(一对?
(附加)
(映射(延迟fn我的展平错误))
(汽车cdr)
(列表)
。。。如果你觉得这在视觉上更讨人喜欢。太棒了,这很有道理
(define-syntax delay-fn
(syntax-rules ()
[(delay-fn f) (lambda args (apply f args))]))
(define my-flatten-error
(<?> pair?
(<+> append <m>
(</> map (delay-fn my-flatten-error))
(<Y> car cdr))
list))