Recursion 强制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结构)

为了好玩,我在Racket中创建了一系列函数,可以创建和组合其他函数

现在我已经根据它们定义了一个递归函数:

(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))