リスト

Haskellではリストを以下のように記述する。

[1, 2, 3]

現段階の知識ではこれを変数に代入する方法がわからない。以下のように記述したらエラーが出た。

lst = [1, 2, 3]

で、リストを利用したプログラムとしてcountlineコマンド、標準入力の行数を数えるコマンド。

main = do cs <- getContents
          print $ length $ lines cs

わけわからん。

getContentsアクションで標準入力を読み取り、それを変数csに束縛する。ここまではOK。
$記号は二項演算子、右辺の式の結果を左辺にある関数の引数として渡す。
こう書くこともできる。

print (length (lines cs))

lines関数は文字列を改行で区切ったリストに変換する。ここでは変数csの内容をリストに変換している。
length関数は引数で受け取ったリストの要素数を取得する。
print関数は引数で受け取った値を文字列として出力する。
putStrLn関数との違いは、putStrLn関数が引数に文字列のみを受け付けるのに対し、print関数は文字列以外の型も受け付ける。
これだけの処理をこんなに簡潔に記述できるとは、Haskellおそるべし。

C#で書くとこうなる。こうやってみるとC#でも簡潔さはそんなに変わらへんか?

public static class Hoge {
    public static void Main() {
        Console.WriteLine(
            Console.In.ReadToEnd().Split('\r').Length
        );
    }
}