リストの要素数を調べる
- 正直、 用意されているプレリュード関数lengthを使用してしまえば、終わりの話だが、それだとつまらないので、プレリュード関数lengthを自作してみるとこんな感じになります。
length.hs
main :: IO ()
main = print (length [0..9])
- ここで注目したいのが、myLength :: [a] -> Intです。
- プレリュード関数lengthもそうなのですが、意味的には任意の型aに対して、関数myLengthが型[a] -> Intを持つことになります。
- つまり、1つ以上の型変数を含む型ということになります。(=> 多相型)
myLength.hs
main :: IO ()
main = print (myLength [1, 2, 3])
myLength :: [a] -> Int
myLength [] = 0
myLength (_:xs) = 1 + myLength xs
リストの要素数を加算する
- ここで面白いのは、関数呼び出し時に、引数にパターンマッチングを行なうことです。
- 空集合[] の時とそれ以外。それ以外の場合は、引数を先頭要素とそれ以降に分けている。
- 引数に、(x:xs)と書くと、[1,2,3]というリストが渡って来た場合、x には、先頭の要素 1 が、xsには、残りの[2,3]が渡ります。
- その為、再帰処理が可能になるのです。
mySum.hs
main :: IO ()
main = print (mySum [1, 2, 3])
mySum :: Num a => [a] -> a
mySum [] = 0
mySum (x:xs) = x + mySum xs
- また、面白いのが、最後の演算でこの場合、最後は空の集合なので下記のようになります。
1 + [2,3]
-> 1 + [2,3]
-> 1 + 2 + [3]
-> 1 + 2 + 3 []
-> 6
リストの最初の要素を調べる
- 関数myHeadの型が、[a] -> Maybe a とここではしています。
- このMaybeなのですが、「1個までしか値が持てないリスト」に相当するモナドです。
モナド | 0個 | 1個 |
---|---|---|
リスト | [] | [x] |
Maybe | Nothing | Just x |
myHead.hs
main :: IO ()
main = print (myHead [3, 2, 1])
myHead :: [a] -> Maybe a
myHead [] = Nothing
myHead (x:xs) = Just x
リストの最後の要素を調べる
myLast.hs
main :: IO ()
main = print (myLast ["w", "aaaa", "bbbb"])
myLast :: [a] -> Maybe a
myLast [] = Nothing
myLast (x:[]) = Just x
myLast (_:xs) = myLast xs