関数プログラミング
artonさんの日記経由で
http://cappuccino.jp/keisuken/logbook/20070525.html#p02を見たけど、それ関数的じゃないです。
というのは、 set っていう名前が気になったので試してみたんですけど、
import java.util.*; public class Func { interface Fn<T> { T $(T arg); } static <T> List<T> map(List<T> list, Fn<T> fn) { for(int i = 0; i < list.size(); i++) { list.set(i, fn.$(list.get(i))); } return list; } static <T> List<T> list(T… values) { List<T> list = new ArrayList(values.length); for(T value : values) { list.add(value); } return list; } public static void main(String[] args) { List<Integer> l1 = list(1, 2, 3); List<Integer> l2 = map(l1, new Fn<Integer>() { public Integer $(Integer n) { return n * n;}}); for(Integer n : l1) { System.out.println(n); } for(Integer n : l2) { System.out.println(n); } } }
これを実行すると、
% java Func 1 4 9 1 4 9
てことで、このコードに相当するのは Ruby では map ではなくて map! です。べつに map! でも実用上はいい場合が大半だと思いますが、しかしそれは少なくとも関数プログラミングではない。関数的と名乗るなら、 clone するんだか new するんだかわかんないですけど、そのようにしてコピーするべきです。
そういえば $ という関数名は、わたしは prototype.js を見て JavaScript で使えるのをはじめて見たときに「おおっ」って思ったんですけど、ほかの言語だとどれくらい使えるもんなんでしょうね(ってなんだ、Cでも使えるのか……)。
まぁ私の日記ではRubyのソースでmap!で例を出してますしね.