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に遊ばれてみよう。