LoginSignup
2
0

More than 1 year has passed since last update.

Haskellのリストでいろいろやってみた

Posted at

リストの要素数を調べる

  • 正直、 用意されているプレリュード関数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 

参考文献

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0