関数プログラミング

This entry was posted by on Friday, 25 May, 2007

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でも使えるのか……)。

One Response to “関数プログラミング”

  1. keisuken

    まぁ私の日記ではRubyのソースでmap!で例を出してますしね.