基本的な構文

7.1 コメント

リテレイト形式について

まぁ、内容は理解出来ましたが、リテレイト形式は不思議な感じがします。
コードの方が脇役的になる書き方、ちょっと違和感がありますね。
こういうことが出来る、という楽しさはありますけど、あまり使わなさそうです。
ちなみにHatenaのタグできちんと出るのかな?

  • リテレイト形式
> main = print cube 6

関数 cube は引数の3乗を返すよ。

> cube Int -> Int
> cube n = n * n * n
  • 通常形式
main = print cube 6

-- 関数 cube は
{-
    引数の3乗を返すよ。
-}

cube Int -> Int
cube n = n * n * n


やっぱりリテレイト形式はいけてませんねぇ。

Haddockについて

本書でちょっとだけ紹介されていましたが、気になったので調べてみました。
本書で掲載されていたサイトに行ってみると、Haddockを使うには

darcs get http://code.haskell.org/haddock/


しなさい、とのこと。darcsっていうのが入っていなかったので、
このサイトを見ながらインストールしてみました。すると途中で

% cabal install darcs
...(中略)...
[139 of 139] Compiling Main             ( src/darcs.hs, dist/build/darcs/darcs-tmp/Main.o )
Linking dist/build/darcs/darcs ...
cabal: Error: some packages failed to install:
darcs-2.4.4 failed during the building phase. The exception was:
ExitFailure 9
%


ありゃりゃ、どうもインストールに失敗したみたい。
インストール中にブラウザやemacsが強制終了するなど、何やら不穏な感じがしていたのですが、ダメでした。
エラーメッセージを見るとどうも一部のパッケージのインストールに失敗しているとのこと。
う〜む、よく分からないので、とりあえず棚上げに。
…いろいろ試したけどやっぱり同じ結果に。今後ないのも不安なので、apt-getでサクッとインストールしてしまいました。
でも何だかすっきりしない。。。


…と思ったら、入ってました、haddock。いつ入れたんだろう?
早速これまで作成したソースコードにかけてみます。

% mkdir html
% haddock -html -o html expand0.hs
Warning: Main: could not find link destinations for:
    Main.main
%


外部モジュール(Main.main)が参照出来ずにWarningが出てるみたい。
色々(というほどでもないけど)試した結果、こんなオプションがよろしい感じ。

%  haddock -html -o html --ignore-all-exports expand0.hs
Warning: Main: could not find link destinations for:
    GHC.Base.String GHC.Types.Char
%


相変わらずWarningが出てるけど、表示はまずまず。

7.2 レイアウト


個人的な感想ですが、私はプログラミング言語の文法にレイアウトを取り入れるのはあまり好きではありません。
コードの見栄えが統一されるので見やすくなると言われますが、長年C言語に慣れてしまうと、
逆に自由にインデント出来ないことが気になってしまうのです。
やっぱり人それぞれしっくり来るインデントってあると思うんですよね。


Haskellにはレイアウト(オフサイドライン)の規則もあれば、中括弧(ブレース:{})で代用出来る規則もあるんですが、
このレイアウトの規則に誤って合わしてしまわないように、常に意識しないといけなさそう。
たしかPythonなんかも言語仕様にレイアウトが取り入れられていると聞きますが、ちょっと合わないかなぁ〜なんて。

haskell-modeについて

本書とは全然関係ないことなんですが、
emacshaskell-modeに関して、ちょっと誤解していたことがあったので、記載しておきます。
たとえば、

hogehoge = do cs <- getContents
              putStr cs


というコードを書く時、doのコードブロックを定義するために、
2行目のインデントをdoの次の単語に合わせる必要があります(本章で出てきた内容ですね)。
この時、putStr csの行でTAB(またはCtrl-i)を入力すると、

hogehoge = do cs <- getContents
                    putStr cs


というように、getContentsに揃ってしまっていました(<-の次の単語と言うべきかな)。
この時私は、イソイソとBackSpaceでcsにインデントを戻していました。
ですが、もう一度TAB(Ctrl-i)を入力すると、

hogehoge = do cs <- getContents
              putStr cs


という具合にインデントが変わります。おぉ〜、今気づきました。
ちなみにもう一回TAB(Ctrl-i)を入力すると、

hogehoge = do cs <- getContents
putStr cs


となります(先頭にインデントされます)。
つまりTAB(Ctrl-i)を入力するとインデントがトグルするんですね。
これはhaskell-modeがHaskellのレイアウト規則をちゃんと理解しているからなんですね。