Ruby でパターンプログラミング

Ruby の配列操作メソッドに shift がある。これは配列の先頭の要素を取り出すが同時に元の配列からその要素は取り去られる。これを使うとRuby でもHaskell の (x:xs) のようなパターンプログラミングができるのではないかと考えた。下の例の square(x) は引数を2乗する関数だが、mymap(x) は配列を引数にとり、それぞれの要素にsquare(x) を適用した配列を返す。

irb(main):001:0> def square(x)
irb(main):002:1>   x * x
irb(main):003:1> end
=> nil
irb(main):004:0> def mymap(x)
irb(main):005:1>   if x == []
irb(main):006:2>     []
irb(main):007:2>   else
irb(main):008:2*     [square(x.shift)] + mymap(x)
irb(main):009:2>   end
irb(main):010:1> end
=> nil
irb(main):011:0> mymap([1,2,3])
=> [1, 4, 9]

Ruby にはmapメソッドがあるからいらない工夫だが、適用する関数に普通の関数を使うことができる。


今日の Haskell
foldr の簡単な理解の仕方はリストの (:) 演算子を引数の演算子で置き換えると良いらしい。
foldr (+) 0 [1,2,3] == (1 + (2 + (3 + 0))) -- [1,2,3] == (1 : (2 : (3 : []))) の : を + に置き換え。単なる記憶法でなく理論的にもそうらしい。

だんだんネタ切れになってきた。そろそろ沈黙して勉強する時期かも。
[PR]
by tnomura9 | 2010-11-23 21:33 | Haskell | Comments(0)
<< 再帰関数とループ 二次式の因数分解 >>