手続きのカリー化?

カリー化についてはよくわかってないけど、srfi-26がやたら便利そうだ。

SRFI 26: Notation for Specializing Parameters without Currying

メモ。

(cut * 2 <>)

とやると、

(lambda (x) (+ 2 x))

になる。


実際使ってみた方が早い。

((cut * 2 <>) 10)         ; 20
((cut * <> <>) 3 4)       ; 12
((cut * <...>) 1 2 3 4 5) ; 120

あぁ〜lambda要らねぇ〜。


素敵過ぎるぞ!!カリー化!!

おぉ解説ページ発見。

Gaucheの場合

pa$で末尾をカリー化出来るらしい。

gosh> ((pa$ * 2) 10)
20
gosh> ((pa$ * 2) 1 2 3)
12

ほぉぅ。

疑問

マテ。<>は順番どうりにしか束縛できないから、xconsは作れないってことかな?

わからん。

妄想

{(a b) (cons b a)}

とか書けたら・・・。

追記

GaucheとMzSchemeでは、defineでこんな書き方も出来る。

(define ((add x) y)
  (+ x y))

(map (add 10) '(1 2 3 4 5))
; (11 12 13 14 15)

展開すると、

(define (add x)
  (lambda (y)
    (+ x y)))

lambdaを省略して見通しが良くなる。defineの定義が再帰的?

まとめ

Haskellのカリーはlambda書きたくないという構文糖衣的理由ではなく、引数が一個しか取れないというλ計算の理論を忠実に守ったモノなので、Schemeでカリーすることと、Haskellのカリーでは相当意味合いが違う気がする。