【发布时间】:2017-03-31 07:17:26
【问题描述】:
我知道在 Racket 上用“是否可能”开始提问有点愚蠢(但我走了)
是否可以创建类似于 OCaml 的仿函数的参数化模块? 假设我有以下结构
;;module A
(define x ...)
(provide foo)
(define (foo a) (format "x for foo: ~a ~a" x a))
(define (bar a) (format "x for bar: ~a ~a" x a))
然后我定义了 2 个使用模块作为定义的其他模块
;;module B
(require "A.rkt" #| '(value for x is "lala") |# )
(define result1 (foo "lulu"))
(define result1 (bar "lili"))
;;result1 => "x for foo: lala lulu"
;;result2 => "x for bar: lala lili"
和
;;module C
(require "A.rkt" #| '(value for x is "empty") |# )
(define result1 (foo "really"))
(define result1 (bar "nothing"))
;;result1 => "x for foo: empty really"
;;result2 => "x for bar: empty nothing"
显然我可以将 foo 和 bar 定义为每个都有一个附加参数, 部分应用该附加参数并定义新功能
;;module A2
(provide foo)
(define (foo x a) (format "x for foo: ~a ~a" x a))
(define (bar x a) (format "x for bar: ~a ~a" x a))
然后
;;module B2
(require "A2.rkt")
(define foo1 (partial foo "homemade"))
(define bar1 (partial bar "homemade"))
(define result1 (foo1 "really"))
(define result1 (bar1 "nothing"))
;;result1 => "x for foo: homemade really"
;;result2 => "x for bar: homemade nothing"
但这真的不是我想要的——而是我想以某种方式保留模块/要求方式,而不必重新定义 (几乎相同的)功能一遍又一遍。
有什么办法吗?
【问题讨论】:
-
如被问及,您需要units,它与 ML 仿函数极为相似。但在实践中,您通常可以使用 parameters 或其他更简单的结构,因此单位在实践中并不常用。
-
我阅读了参数,但我还没有理解它们。也许您可以在上面写一篇超级棒的博客文章;-) 不,非常感谢您的指点
-
我会写一个真实的答案,但现在,我需要睡觉了。 ;) 如果其他人在我有机会的时候还没有,我会写一些东西。