理想未来ってなんやねん

娘可愛い。お父さん頑張る。

Haskell 9日目

Haskell 9日目。

今日は基本的な構文の前半です。

コメント

1行コメント

1行コメントの例

square n = n * n -- nの2乗

『--』から行末までがコメントになります。
ただし『-』は演算子としても使える記号なので、『--』の直後に記号を書いてしまうと演算子と解釈されてしまいコメントになりません。
『--』の後には空白を入れる癖をつけておくと良いでしょう。

ブロック形式のコメント

ブロック形式のコメントの例

{- コメント -}
{- 
ブロックコメント
  {-
    コメントブロックのネスト 
  -}
-}

『{-』から『-}』までの部分がコメントと見なされます。
HaskellのブロックコメントはCと違いネストできます。

リテレイト形式

Haskellソースコードにはリテレイト形式(literate style)という形式があります。
リテレイト形式ではコードの中にコメントを書くのではなく、コメントの中にコードを埋め込みます。
リテレイト形式にする場合の拡張子はlhsにするのが慣習です。

> main = print $ square 5

関数 squareは数値 n の 2乗を返す
> square :: Int -> Int
> square n = n * n
\begin{code}
main = print $ square 5
\end{code}

関数 squareは数値 n の 2乗を返す

\begin{code}
square :: Int -> Int
square n = n * n
\end{code}

行の先頭を『<』で始めるか、『\begin{code}』から『\end{code}』まで囲んだ箇所がソースと認識されます。
この2つの形式はGHCで試す限り、どちらか1つのソースでどちらか一方のようです。

尚、著者もプログラミングの主役はコードであるため、リテレイト形式はおすすめできないと述べています。

リファレンスマニュアルをソースコード中に書きたいのであれば、Haddockを使いましょう。

レイアウト

レイアウト

インデントをそろえる事でコードブロックを表現する方法。

main = do cs <- getContents
          putStr cs

複数の式の桁を揃えることによって式をまとめる方法をレイアウト(layout)またはオフサイドルール(off-side rule)と言います。
レイアウトを合わせる桁(オフサイドライン)は予約語let, where, do, ofのあとに現れる単語の位置によってきまります。

ブレース構文

インデントを揃える以外にもブレース『{}』と『;』を使う事でコードブロックを表現できるようになります。

main = do {
  cs <- getContents;
  putStr cs
}
コードブロックのネスト

オフサイドラインは予約語のdoやofより浅くなっても構いません。

main = do
  cs <- getContents
  putStr cs

ただし、つぎのように書くことはできません。

main = do
cs <- getContents
putStr cs

mainの変数定義はモジュールブロックに属する為、mainの桁に揃えてしまうと、main変数の定義と同列にならぶものだと解釈されてしまいます。

式の継続

レイアウトにはオフサイドラインの規則の他に、『所属するコードブロックのオフサイドラインよりも深く(右に)インデントすると前の行の続きになる』というルールがあります。

main = do cs <-
             getContents
          putStr cs 

getContentsがcsよりも深くインデントされることで、この行は『cs <-』の続きだと解釈されます。


今日のところはここまで。
明日はif式に進みます。