Currying
我只是寫 continuation 寫一寫非常不滿意,果然先寫個廢文好了,這篇只是一個把 racket 改成 currying 的 macro 說明:
#lang racket (require (for-syntax syntax/parse)) (define-syntax (curry stx) (syntax-parse stx [`((~literal λ) (p) body) #'(λ (p) body)] [`((~literal λ) (p params* ...) body) #'(λ (p) (curry (λ (params* ...) body)))]))
先把 macro 寫好,現在來思考一下所謂 currying 到底做了什麼,簡單來說它就是 λ 只需要一個參數就好,多參數可以用多層函數模擬。坦白說,超沒用。然後套到 fp 最愛的 lazy compute,它把 λ 變成多個 λ 之後就能捕捉部分參數並回傳剩餘 λ。所以第一步就是 λ 要被轉換成多層,而本來就一層的我們不管它。於是廢文就寫完了。我們可以試一下:
((((curry (λ (a b c) c)) 1) 2) 3) ;;; result: 3