强制球拍接受递归变量定义作为递归函数定义

时间:2014-09-08 18:17:33

标签: recursion functional-programming racket

为了好玩,我在Racket中创建了一系列创建和组合其他功能的功能。

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

(define (my-flatten2 struct)
  ((<?> pair?
       (<+> append <m>
            (</> map my-flatten2)
            (<Y> car cdr))
       list)
   struct))

我首先尝试了这个,但它没有用(它在定义错误之前给了我一个简单的参考标识符):

(define my-flatten-error
  (<?> pair?
       (<+> append <m>
            (</> map my-flatten-error)
            (<Y> car cdr))
       list))

任何人都可以解释为什么它不起作用,以及是否有办法解决它。

记录

  • <+>撰写
  • <Y>创建一个函数列表,将函数列表应用于一个arg
  • </>部分适用
  • <?>是选择

1 个答案:

答案 0 :(得分:3)

球拍是一种渴望的语言;它在传递参数之前对其进行评估。因此,您的代码无法正常工作

(define p (add1 p))

不起作用。

在这种情况下,假设my-flatten错误确实是一个函数,只需延迟my-flatten-error的评估就可以很容易地解决问题:

(define my-flatten-error
  (<?> pair?
       (<+> append <m>
            (</> map (lambda args 
                       (apply my-flatten-error args)))
            (<Y> car cdr))
       list))

您还可以使用宏隐藏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))

......如果你发现视觉上更令人愉悦。