UP | HOME

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
Date: 2020-05-31 Sun 00:00
Author: Lîm Tsú-thuàn