畳み込み関数のメモ

Rubyはinject,Schemeはreduceまたはapply。

1から10まで足してみる。

Ruby

injectしてみる。

(1..10).inject {|sum, i| sum + i}
# => 55

う〜ん。わかりにくいな。

Scheme(Gauche)

reduceで

(use srfi-1) ; iota用

(reduce + 0 (iota 10 1))
; 55

srfi-1のfoldを使う。

(fold + 0 (iota 10 1))
55

consと一緒に使うと逆順になっちゃうので、個人的には、fold-rightがお気に入り。

JavaScript

1.8からreduceが!

Core JavaScript 1.5 Reference:Objects:Array:reduce - MDCのCompatibilityをコピッペして

[1, 2, 3].reduce(function(a, b){ return a + b; });
// 6

おぉぉぉぉぉぉぉ。

Python

ついでに、覚えたてのPythonなら

reduce(lambda a, b: a + b, range(1, 11))
# 55

ほぉほぉ。

Perl

それなら,Perlもいっとこう。

use List::Util;
List::Util::reduce{$a + $b} 1..10
# 55

$a,$bは何処からやってきたんだ・・・perl全然わかんねぇ・・・。

Haskell

僕の課題、Haskellもいっとこー

Hugs> foldr (+) 0 [1, 2, 3]
6

IBMの記事がイイ!!

OCamlはfold_left。Erlangはわかんね。

まとめ

  • 色々な言語で試すと発見がいっぱい。
  • 畳み込み関数はreduceを使う場合が多い。ML系はfold。Rubyのinjectは特殊。

初期値にリストを持ってくると宇宙のように応用範囲が広がる。