MATLABでカリー化
一度関数型プログラムの考え方に触れると、どの言語でも同じようなことがしたくなってしまいます。
MATLAB は便利ですが、当然関数型ではないので勉強がてらちょっとずつ自作しています。
その過程で、カリー化をしようとしてハマったのでメモ。
結論からいうと、セル配列が使えました。セル配列は型の違うものをひとまとめに扱うしくみで、
取り出すときには小括弧と中括弧の2つの方法があります。
中括弧を使って範囲指定をして取り出すと、多値で答えが帰ってくるので、これを使って curry がつくれました。
function f = curry(f, varargin) %curry do currying % feval(curry(@plus, 1), 10) => 11 % feval(curry(@strcat, 'a', 'b', 'c'), 'z') => 'abcz' if nargin >= 2 xs = varargin; f = curry(@(varargin) f(xs{1}, varargin{:}), xs{2:end}); end
第1引数の f をそのまま返値にしているので、 nargin == 1 の場合はそのまま f が返ります。
この辺り、お行儀が良いのかはよくわかりません。明示的に分岐を書いた方が読みやすい気もします。
# 追記
と思ったら、まんま stack overflow に書いてあった。。。