『関数プログラミング入門』第3章 数値 なんだが、ごちゃごちゃ面倒なことが書かれていて、
読んでいると眠くなってきたので、適当に読み飛ばして、第4章リストで少し遊んでみよう。
プログラミングの本の読書とは、本はまあ普通に読んだり、読み飛ばしたりしながら、
本の趣旨とは違うことをやってみることだ。
haskellでは、無限リストが扱えるので、そのあたりが楽しいのだが、
無限リストは第9章になっている。
でも、この本、こんなものが載っているのだ。
from :: Integral a => a -> [a]
from n = n : from (n+1)
リストで再帰つかって、無限リストを作っているのだ。
で、試してみた。
*Main> from 0
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85
延々と出てくるので、 C-c で止めるしかないのだ。
さて、また漢字に戻ろう。
漢字1文字を与えると、その文字コード以降の文字のリストを返す関数をでっちあげてみよう。c
を文字とすると、
chr ((ord c) + 1)
で次の文字になる。
これを使って、1文字を与えると、文字の無限リストを返す関数を書いてみた。
文字のリストは文字列なので、無限長の文字列を返すことであもある。
import Data.Char
nextK :: Char -> [Char]
fromK c = c : fromK (chr ((ord c) + 1))
では早速確認
*Main> fromK '一'
"\19968\19969\19970\19971\19972\19973\19974
C-c
となって、数値表示が延々と続いてしまう。
これではいけないので、 putStrLn
で、漢字表示にしてみよう。
*Main> putStrLn (fromK '一')
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗
C-c
これできちんと表示されているのだが、ブラウザによっては、
日本のJISの文字にしか対応していない場合(ユニコード非対応)の場合には、
非対応文字は?での表示になったりする。
無限長文字列を書くのは現実的ではないので、先頭から指定文字数文だけを
取り出すことにしよう。
指定文字数ということは、リストの先頭から指定個数だけ抜き出したリストだ。
リストから n
個取り出すには、 take n list
でよいので、やってみよう。
では、ちょっと遊んでみよう。
*Main> putStrLn (take 32 (fromK '一'))
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗丘丙????丞丟
では、ちょっと遊んでみよう。
*Main> putStrLn (take 32 (fromK '漢'))
漢漣??漦??漩漪漫漬漭?漯漰漱漲漳??漶?漸??漻漼?漾漿?潁
*Main> putStrLn (take 32 (fromK '水'))
水氵氶氷永?氺氻??氾氿汀汁求???????汊汋?汍汎汏汐?汒?
*Main>
これで、ユニコードは部首順であるのが想像つくだろう。
ユニコードの漢字は、 '一'
で始まり、20902文字がずっと連続しているのだ。
なので、
putStrLn (take 20902 (fromK '一'))
で、全ユニコード文字を表示できるのだ。
では早速実験してみよう。
最後の文字までちゃんと出るだろうか。
*Main> putStrLn (take 20902 (fromK '一'))
一丁丂七丄丅?万丈三上下丌不与?丐丑丒?且丕世丗丘丙????丞丟
.......................
龠龡龢龣?龥
となって、最後の文字「龥」までちゃんと表示された。
ブラウザによっては、文字によって、
綺麗な文字と汚い文字が混じっているかも知れないが。
でも、かなり待たされたのであった。