Rubyのドット記法

Haskell の高階関数をつなげて使うやり方を Ruby でやるにはどうするかと考えて、Haskell の関数の移植をしてみたが、落ち着いて考えたら、Ruby のドット記法をつなげて使ったら同じことができたのだということに気がついた。

例えば、星印でピラミッドを描く方法は、Haskell では次のようにできるが、

Prelude> putStrLn $ unlines $ map (flip(replicate) '*') [1..5]
*
**
***
****
*****

Ruby でもドット記法を使うとつぎのように簡単に実現できる。短さでは Haskell に負けていない。

irb(main):013:0> puts (1..5).to_a.map {|x| "*" * x}.join("\n")
*
**
***
****
*****

そういう訳で、管理人の Ruby Haskell 化計画もあえなく終了となった。

要するに、Haskell であろうが、Ruby であろうが、ループを使わずにリスト処理を使い、高階関数と関数の合成を使うと、プログラムが劇的に簡潔になるということだ。関数言語の記述の簡潔性の秘密はここにあったのだ。

Rubyと同じように手続き型の言語でありながら、高階関数がつかえる言語がもう一つある。それは、JavaScript だ。JavaScript は単なるブラウザの付属品ではない。羊の皮を被った狼だ。

再帰関数、関数合成、高階関数、リスト処理、この4つが簡潔な記述のプログラムを作るためのキーワードになるようだ。


きょうの Haskell
上三角のピラミッドを描くには、
Prelude> putStrLn $ unlines $ map (flip(replicate) '*') [1..5]

下三角のピラミッドを描くには、
Prelude> putStrLn $ unlines $ map (flip(replicate) '*') [5,4..1]

上三角の下に下三角を続けて描くには、do {putStrLn .... ; putStrLn ... } ではなくて、
Prelude> putStrLn $ unlines $ map (flip(replicate) '*') ([1..5] ++ [5,4..1])

同じ操作はまとめてしまうのが、Haskell の流儀。
[PR]
by tnomura9 | 2010-12-09 01:03 | Haskell | Comments(0)
<< JavaScript の ma... Ruby の関数と副作用 >>