为了好玩,我在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 </>
部分适用<?>
是选择答案 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))
......如果你发现视觉上更令人愉悦。