Hatena::ブログ(Diary)

あどけない話

2008-09-02

すご過ぎるとおもちゃに見える

「達人プログラマー」の14ページでは、「毎年少なくとも一つの言語を学習する」ことが提案されています。

この大切さを雄弁に語っているのは、「普通のやつらの上を行け」の『「ほげ言語」のパラドックス』です。(「ほげ」の部分は、もっと適切な単語に訳して欲しかったです。。。)

小賢しい人は、「ほとんどの言語はチューリング完全だ」だと反論します。そのとき、「じゃぁ、全部アセンブラで書けば」と感情的に言い返すことはできても、客観的に諭すことは僕にはできませんでした。

その答えを見つけたのは、LL Futureの「LL で未来を発明する」です。住井さんは、「すべての言語はチューリング等価だが、抽象度が違う」と説明されていました。「そうそう、僕はそう説明したかったんだ」と言い当てて頂いた気分です。

(関係者の人には申し訳ありませんが、率直に言って、このセッションは失敗だったと思います。せめて、10年後の話にしたらよかったのではないでしょうか? 松本さんの「数学の記号は数千年使われている」という発言にも、「おいおい」って思って聞いていましたが、住井さんが訂正して下さってよかったです。数千年前には数学がありましたが、そこで使われている表記に現在の我々が親しみを覚えることはまったくありません!)

抽象度の高いものと言えば、Haskell代数データ型です。昨日、会社の若者に、こう説明してみました。

「昔、トロントに行ったとき、CNタワーという当時世界一高いタワーに登った。展望室の底にはガラス窓があって、そこから見ると人が蟻のように見えた。余りにも現実離れしていて、怖いと感じるのを通り過ぎて、下界がおもちゃに見えた。同じように、Haskell代数データ型は、すご過ぎて一見おもちゃに見える。」

データを簡潔に表現することは、本当に大切です。僕の大好きな本「物理数学の直観的方法」の後記を引用して、この記事を締めくくりたいと思います。

一般に大きな発展の直前には必ずと言っていいほど記号の大幅な簡略化が行なわれているものである。...

数学の歴史が簡略化の歴史だというのは確かに一面の真理ではあって、例えば現在われわれが中学の数学の教科書でせいぜい数ページで学んでいる代数の内容が、中世では分厚い本10冊ほどもある難解な体系だったのだそうである。

物理数学の直観的方法

物理数学の直観的方法

2008-09-01

横向きのピラミッドを作る

LL Futureの「キミならどう書く?」に出題されている問8を Haskell で解いてみます。

与えられた自然数 n について、横向きで n 段のピラミッドを作ってください。たとえば、 n に 4 が与えられた場合は以下のようなピラミッドを作ります。

*

**

***

****

***

**

*

与える自然数についてはリテラルで与える、標準入力で与える、引数で与えるなどは自由とします。

これは、[1,2,3,4,3,2,1] という整数の列を作る問題と等価です。

このセッションでは、すべての桁が 1 である数値を二乗して解く方法が紹介されていました。

1 → 1

11 → 121

111 → 12321

1111 → 1234321

この方法を Haskell で実装してみましたが、Haskell では数値と文字列が厳密に区別されているので、すっきりとは書けませんでした。そもそも、この方法には桁溢れの問題もあるので、会場で感じた程、素敵な方法ではないと思いました。

そこで、素直に Haskell で書くことにしました。[1,2,3,4,3,2,1] を生成するのは、こんなに簡単に書けます。

incdec n = [1..n] ++ [n-1,n-2..1]
incdec 4 → [1,2,3,4,3,2,1]

次に、文字 '*' を n 個くっ付けて文字列を作る関数を書きます。Perl の "x" 演算子に相当します。

x c n = take n $ repeat c
'*' `x` 4"****"

というわけで、pyramid ができました。

pyramid n = mapM_ putStrLn $ map ('*' `x`) $ incdec n
pyramid 4*
**
***
****
***
**
*