:(コロン)演算子
ふつうの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]