Learn Haskell in 10 minutes

まだ、よちよちある期なので Learn Haskell in 10 minutes - HaskellWiki をやってみる。

2 Simple expressions
  • 数値の計算。累乗は言語構造として取り入れられている。演算子の優先度はどうなっているのだろうか?まぁ、括弧を付ければいいのだが。
  • 文字列。++ で結合。シングルクォートで2文字以上囲むとエラー。1文字ならエラーにならない。文字列ではなく、文字のコード値を表すのかな。
  • 関数。引数に括弧はいらない。用意されている関数ってどんなのがあるんだろう?使い始めたばかりの言語で困るのは、文法もだけど、どういう関数がすでに用意されていて、どういう関数が用意されていないのかがわからないってことも。
3 The console
  • 出力。pusStr(Ln) の引数は文字列のみ。print は数値でもOK。一行で幾つかの出力をしたい場合は、do ブロックを使う。そのときはセミコロンで区切る。
  • 入力。getLine は文字列を返す。readLn は適当な型を返す。型を変換してくれるわけではないようだ。
Prelude> do { n <- readLn ; print (n + 1)}        
"123"
*** Exception: user error (Prelude.readIO: no parse)
Prelude> do { n <- readLn ; print (n + 1)}
123
124
Prelude> do { n <- readLn ; print (n ++ "1")}
"123"
"1231"
Prelude> do { n <- readLn ; print (n ++ "1")} 
123
*** Exception: user error (Prelude.readIO: no parse)
  • do ブロックはインデントを用いればセミコロンで区切らなくてもいい。インデントは do より後に洗われる空白でない最初の文字の位置まで字下げする必要あり。レイアウト 記法っていう。 Python とはまた違った感じ?
4 Simple types
  • 型を定義したいときは :: を使う。同じ値を入力しても、よきにはからってくれる。ただし、無茶振りは突き返してくる。
Prelude> 5 :: Integer  
5
Prelude> 5 :: Double   
5.0
Prelude> 5 :: String   

<interactive>:1:0:
    No instance for (Num String)
      arising from the literal `5' at <interactive>:1:0
    Possible fix: add an instance declaration for (Num String)
    In the expression: 5 :: String
    In the definition of `it': it = 5 :: String
  • :t で型の確認。
  • Int と Integer は違う。Int は少なくとも 30 bit の精度。Integer は無限大の精度。
  • unit。よくわかんないけど、() と書くのもありってこと?何に使うのかは不明。
5 Structured data
  • リスト。同じ型しか含められない。: はリストに要素を追加する。
    • map, filter 関数。Ruby の map, select みたいな感じ?
  • タプル。違った方を含められる。要素数は固定。
6 Function definitions
  • ghci でソースを読み込めば :t で型が表示できる。
Prelude Main> :t factorial 
factorial :: (Num a) => a -> a

見方は「関数名 :: (a の型) => 引数 -> 返り値」でいいのかな。

7 Convenient syntax
  • let は一時的な名前の定義。ローカル変数みたいな感じか?
  • case は複数分岐。 switch 文みたいな感じ。_ は条件に当てはまらなかった場合の処理。
8 Using libraries
  • import でライブラリ(モジュール?)の読み込み。
  • 達人 Haskell プログラマになるには、Prelude以外の ライブラリに詳しくなれ。
9 Topics that don't fit in 10 minute limit
  • この内容を10分か?目を通すならできるだろうけど、理解しながらは厳しいんじゃないのか、と unproductive programmer が言ってみる。