問題 #0
#0
1からnまでの和を答えよ。
#0のhaskellによる答え。
sum[1..n]
えっ、ずるい。じゃ、別解。
sum 0 = 0
sum n = n + sum(n-1)
haskellでよく使う再帰だが、pythonのforループで書いたほうが、効率がいい。再帰だと、スタックを浪費するからだが、haskellでは、末尾再起でなく、普通に書いても、コンパイラが勝手に、スタックを消費しない、末尾再起に最適化してくれるので、問題ないのだ。
ついでに
take 10 [1..]
上のhaskellのtakeは、1から始まる無限リストから、最初の10個を取る関数。
haskellは、純粋関数型言語の特徴ともいえる、遅延評価戦略を用いている。他の言語だと無限リストを用意してから、その先頭の、10個を取ろうとする。しかし、無限の処理だから、何時まで経っても終らない。これに対し、haskellの遅延評価では、必要になるまでは、評価しないので、10個取って終わり。瞬時に終わる。
遅延評価には欠点もあるが、その説明はは割愛する。