2006年07月17日

injectでProcを取り扱うことの利点

(1..10).inject(0,&b) 以上に何かやりたいことがあると考えると、それはブロック(Proc)を合成することだと思うので、ブロックを合成する方法を考えるのも良いかもしれない。
posted by ttate at 14:12

2006年06月13日

with_index

blockutilsでは、with_indexというブロックを修飾するためのメソッドがあるのですが、もともとenumeratorの実装に不満をもっていたときに思ったことを、smlではどうなるか書いてみた。
fun new_counter i =
  let
    val n = ref i
  in
    fn () =>
      let
        val a = !n
      in
        n := !n + 1;
      ..
posted by ttate at 00:48

2006年06月09日

zipWith

「zipWithの自作」や、 「今日の自作関数」より。3通りで書いてみる。

まずは、collect,zipを使うとこうなる。

def zipWith(x, y, &b)
  x.zip(y).collect(&b)
end
さらに、 zipを使わないで再帰のかわりにinject使うとこうなる。(長さ違うときの仕様が…)
def zipWith(x, y, &b)
  x.inject(y.dup){|acc, a| acc.push(b.ca..

posted by ttate at 06:00

2006年06月07日

フィルタとカリー化とブロックの合成

「フィルタ(2)」に、私が blockutils で行っているのと似たものがあった。 もともと、ブロック(メソッドやProcオブジェクトの本体)などの手続きを間接的に 操作できているように見せかければ良いという発想である。
これは一般的な関数型言語における関数合成などと同様であるが、 迷うのはRubyのブロックでは高階関数が自然にかけないことだ。 例えば、カリー化などの方法は、Procオブジェクトなどを直接カリー化 するわけではなく、引数の一部を与..
posted by ttate at 06:37

2006年06月02日

blockutils@rubyforge.org

で、ブロックを間接的に操作するようなライブラリを多少整理して、rubyforge.org に置いてみた。 プロジェクトページは、BlockUtils。どんなことができるか概要は、CVS中のREADMEに多少書いた。
posted by ttate at 01:02

2006年06月01日

ブロックの合成(その4:with_xxx)

ここ最近書いている「ブロックの合成」をもうちょい使うと、collect_with_indexなどを、例えば、collectとwith_indexから自動的に合成して計算(あるいは定義)することができる。
require 'blockutils'
include BlockUtils

ary = [:a, :b, :c]
ary.extend(BlockDecorator)
ary.collect_with_index{|elem, idx| [elem, idx..
posted by ttate at 01:27
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。