我正在使用 Racket 学习 CPS,并且我已经设法编写了这些函数:
;lift a regular single-arg function into CPS
(define (lift/k f)
(lambda (x k)
(k (f x))))
;compose two CPS functions
(define (compose/k f g)
(lambda (x k)
(g x (lambda (y)
(f y k)))))
他们似乎工作正常
(define (is-two/k x k)
(k (= x 2)))
(define is-not-two/k (compose/k (lift/k not) is-two/k))
(is-not-two/k 3 display)
(is-not-two/k 2 display)
#t#f
我想知道这些功能是否仍然是“真正的 CPS”。我用这些函数搞砸了“真正的”延续传递吗?在 CPS 中使用函数组合技术是否符合规定?是鼓励吗?或者这样做是否会被视为“妥协”?有没有更多的 CPS-y 方式来做到这一点?
是的,我知道我刚刚问了 5 个问题,但它们背后的基本思想(我不确定我是否理解正确)是相同的。其他 Lisps、Haskell、Erlang 或其他函数式语言的解释都很好。