haskellに遊ばれる
「母国語しか知らない者は、母国語すら知らない」 -- シェークスピア
というのを、何方かが紹介されてて、いたく心に残っています。
同様な事は、プログラミング言語にもあてはまる。と思って、久しぶりに
ソフトウェア・デザインを買ってみた。あのHaskellの特集があったからだ。
まずは、手を動かしてみようという事で、こちらから解説されていたソースを
頂いてきた。
FreeBSDでghcをコンパイルしたら、stage1,stage2,stage3と3回もコンパイルを
繰り返して、やっと使えるようになった。
いざ、ghciから、スクリプトをロードしてみるとエラーである。
ひょっとして、ghcのバージョン違い? と思い、WindowsXPにもghcを入れてみた。
が、やはり頑としてエラーである。
c:\sakae\HS>ghc --make myCat.hs
[1 of 1] Compiling Main ( myCat.hs, myCat.o )
myCat.hs:39:14:
Couldn't match expected type `[Char]'
against inferred type `String -> String'
In the first argument of `(++)', namely `rjust 6'
In the expression: rjust 6 ++ ": " ++ l
In the definition of `combine': combine n l = rjust 6 ++ ": " ++ l
c:\sakae\HS>ghci
GHCi, version 6.10.2: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load "myCat.hs"
[1 of 1] Compiling Main ( myCat.hs, interpreted )
myCat.hs:39:14:
Couldn't match expected type `[Char]'
against inferred type `String -> String'
In the first argument of `(++)', namely `rjust 6'
In the expression: rjust 6 ++ ": " ++ l
In the definition of `combine': combine n l = rjust 6 ++ ": " ++ l
Failed, modules loaded: none.
Prelude> :q
Leaving GHCi.
神様は、我に試練を与えたもう かな?
こうなったら、信じられるのは自分のみ。コードにコメントを入れて、スクリプトを
小さくしていった。だって、コンパイルが出来ない限り、traceとかdeubgger(もし
有れば、ですが)も使えないから、手も足も出ない。
どうも、下記の所で引っかかるなあ。
combine n l = rjust 6 ++ ": " ++ l
大体、n を引数にしてるのに、使われていないよ。それに、rjustって、2引数なの
に、1引数っぽい使い方しかしてないね。
以上の考察から、下記のように変更。
combine n l = rjust 6 (show n) ++ ": " ++ l
どうだ、えぃ。
c:\sakae\HS>ghc --make myCat.hs
[1 of 1] Compiling Main ( myCat.hs, myCat.o )
Linking myCat.exe ...
なお、show n の周りの括弧を忘れると、コンパイルエラーになる。
myCat.hs:39:22:
Couldn't match expected type `String'
against inferred type `a -> String'
In the second argument of `rjust', namely `show'
In the first argument of `(++)', namely `rjust 6 show n'
In the expression: rjust 6 show n ++ ": " ++ l
本場の、女王陛下の英語は難しいなあと、実感した次第!
出来上がったバイナリィーが、大きいのは、訳あり?
どんなライブラリィーを抱えこんでいるのやら?
c:\sakae\HS>ls -l myCat.*
-rwx 775287 2009-04-09 10:05 myCat.exe*
-rw- 1511 2009-04-09 10:05 myCat.hi
-rw- 1028 2009-04-09 10:05 myCat.hs
-rw- 14208 2009-04-09 10:05 myCat.o
(注 上記エラーは、エラッタに報告されてました。とほほ、なんて言わないよ。
デバック方法が分かったんだもの。/注)
今度は、折角入れたFreeBSD上のghcでやってみた。
[sakae@fb ~/HS]$ ls -l myCat*
-rwxr-xr-x 1 sakae kuma 443558 Apr 9 10:45 myCat*
-rw-r--r-- 1 sakae kuma 797 Apr 9 10:45 myCat.hi
-rw-r--r-- 1 sakae kuma 1028 Apr 9 10:44 myCat.hs
-rw-r--r-- 1 sakae kuma 13404 Apr 9 10:45 myCat.o
[sakae@fb ~/HS]$ file myCat.hi
myCat.hi: raw G3 data, byte-padded
[sakae@fb ~/HS]$ ldd myCat
myCat:
libm.so.4 => /lib/libm.so.4 (0x33cbc000)
libgmp.so.7 => /usr/X11R6/lib/libgmp.so.7 (0x33cd2000)
libc.so.6 => /lib/libc.so.6 (0x33d00000)
コンパイル中に出来る、*.hi って、何ものよ。ひょっとして、debug用資料?
それより、バイナリィーに含まれる、libgmpって、X関係の付属物みたいだ
けど、デフォで、GUIも出来るのかしらん?
そうだ、Debianでは、どうなっているかも見てみよう。
sakae@debian:~/HS$ ls -l myCat*
-rwxr-xr-x 1 sakae sakae 457709 Apr 9 11:16 myCat*
-rw-r--r-- 1 sakae sakae 797 Apr 9 11:15 myCat.hi
-rw-r--r-- 1 sakae sakae 1028 Apr 8 17:05 myCat.hs
-rw-r--r-- 1 sakae sakae 13332 Apr 9 11:15 myCat.o
sakae@debian:~/HS$ ldd myCat
linux-gate.so.1 => (0xb7f6e000)
libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7f33000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0xb7ef0000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7eec000)
librt.so.1 => /lib/i686/cmov/librt.so.1 (0xb7ee3000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d88000)
/lib/ld-linux.so.2 (0xb7f6f000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7d6e000)
まあ、似たようなものか。
ついでに、haskell-modeも入れておいた。C-c C-tとかで、typeが表示されたり
既知のものは、自動的にタイプがmini-bufferに出てきて、便利。
暫く、Haskellに遊ばれてみよう。