ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

:(コロン)演算子

ふつうのHaskellプログラミング p78

map関数の定義うんぬんの話の中で、こんな記述があります。

また、「:」はリストを生成する演算子です。リストに対するパターンマッチでは(x : xs)がリストを先頭要素とそれ以降のリストに分解しましたが、関数定義の中で(y : ys)を使うとその逆が起こります。つまり、リストysの先頭にyを追加したリストを生成します。

とあり、勘の悪い僕は、xとかyにそういう意味があるものと解釈してしまいました。。
良く見れば、

  • パターンマッチ(仮引数の部分)では、リストを分解する。
  • 関数定義では、リストを追加する。

ということですね。


簡単なサンプルを書いて、動きを確かめてみる。

-- [2, 3]のリストに1を加えたものをlistとして定義する
list = 1 : [2, 3]

main = do print list
          print $ dellist list
          print $ addlist 4 list

-- dellistは、リストを受け取り、先頭要素を除いたリストを返却する
dellist :: [a] -> [a]
dellist (x:xs) = xs

-- addlistは、要素とリストを受け取り、リストに要素を追加したリストを返却する
addlist :: a -> [a] -> [a]
addlist x xs = x:xs

結果はこう。

[1,2,3]
[2,3]
[4,1,2,3]