思考補助電卓としてのHaskell

Haskell が思考補助電卓として使えるかどうかというのは興味のあるところだが、Haskell のプログラムを自然言語に翻訳してみると面白いことが分かる。

例えば定番の階乗の計算だが、
Hugs> fact 5 where fact 0 = 1; fact n = n * fact (n-1)
120

これを自然言語にすると、「n の階乗は、 n と (n-1) の階乗をかけたものに等しく、0の階乗は1である。」となる。

また、素数の計算は、
Hugs> take 10 $ sieve [2..] where sieve (p:xs) = p : sieve [x| x <- xs, mod x p /= 0]
[2,3,5,7,11,13,17,19,23,29]

なので、sieve すなわち「エラトステネスのふるい」の部分を自然言語にすると、「sieve (p:xs) は自然数のリスト (p:xs) から先頭の数と、残りのリスト xs のなかの数 p で割れない数のリストの先頭の数を並べていったリストを作る。」だ。

また、5文字のリストから3文字を取り出す組み合わせを全て列挙するプログラムでは、
Hugs> comb "abcde" 3 where comb _ 0 = [[]]; comb [] _ = []; comb (x:xs) n = map (x:) (comb xs (n-1)) ++ comb xs n
["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]

comb 関数の再帰的定義の部分を自然言語にすると、「comb n (x:xs) で作られるリストは、引数のリストの先頭の要素を取り出して、その先頭の文字以外のリストから(n-1)個の文字を取り出した文字列の先頭にその文字を付け加えた物のリストと、その先頭の文字以外の文字列から n 個の文字を取り出した文字列のリストを合わせたもの。」

つまり、Haskell のリストと、それを自然言語に直した表現とを見比べると、ほぼ1対1に対応している。つまり、Haskell のプログラムは、自然言語を逐語的にプログラム言語に翻訳したような様相をしめしているのだ。

なぜこうなるのかは分からないが、Haskell が自然言語によって表現したアルゴリズムの逐語的な翻訳を提供するのであれば、Hakell は一種のアルゴリズム電卓と言えるのではないだろうか。Haskell は今のままの仕様でも十分思考補助電卓としての機能があるようだ。


今日の Haskell
乱数の発生
import System.Random

main = do
  gen <- getStdGen
  let ns = randoms gen :: [Int]
  print $ take 10 ns
[PR]
by tnomura9 | 2010-11-26 07:32 | Haskell | Comments(0)
<< 行列をプリントする 再帰関数とループ >>