lambdaってなんだ?

友人に,「lambdaて何やねん」と云われ,「知らんがな」と返す日々におさらばすべく,今日はlambdaを学びたいと思います.少しだけ.

入門

まず,http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/scheme4.htmlの下の方の関数を,rubyでやってみたかんじ.

fact = lambda{|n|
  if n == 0
    puts n
  else
    print "#{n} "
    fact.call(n-1)
  end
}

fact.call(15)

なんだか,再帰やってるって感じはする.実行結果です.

$ ruby lambda_test1.rb 
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

これで,for文が無くても繰り返し処理が行えるぜ.

まだまだ入門

次は簡単なフィボナッチ.

fib = lambda{|x,y,f|
  z = x + y
  print "#{z} "
  if f > 1
    fib.call(y,z,f-1)
  end
}

fib.call(0,1,15)
puts

うん,結局,Proc.newと同じように使っちゃった.ちなみに,実行結果です.

$ ruby lambda_test2.rb 
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

eachのまねごと

forやwhileを使わないと言えば,each.そこで,eachとな似ても似つかないけど,配列の全ての要素に対して,何か行うようなlambdaを.

arr = [1,2,3,4,5,6,7]

each = lambda{ |a,k|
  print "#{a[k]} " # ここに,各要素に対する処理を書く
  if k < a.size
   each.call(a,k+1)
  end
}

each.call(arr,0)
puts

$ ruby lambda_test3.rb 
1 2 3 4 5 6 7 

なんか,こんな事をすると,オブジェクト指向じゃないなぁ.

結果的に思った事

何と言うか,わざわざlambdaやprocを使わないで関数定義したほうが早いんじゃ・・・,そこで早さを比較してみた.比較するのは,コレと.

arr = [1,2,3,4,5,6,7]

def each(a,k)
  print "#{a[k]} "
  if k < a.size
   each(a,k+1)
  end
end

each(arr,0)
puts

$ ruby lambda_ex.rb 
1 2 3 4 5 6 7  

それでは,レッツ比較・・・してみたけど,とても面白くない結果だったので詳細は割愛しますが,結果的にはほっとんど同じでした.まだ利点が分かんないよlambdaとproc.まぁやってる事(アルゴリズムにしても)がしょぼいからなぁ.まだまだ,lambdaも勉強が必要です.