Haskell勉強会

関数型プログラミングの学習日記

Haskellのリスト

Haskellのデータ構造の1種である「リスト」についてメモ。

リストって、要するにデータがズラズラとくっついて、並んだやつですね。

 

haskell.hatenablog.com

 

 

1.3 リスト入門

(p.7)

リストとは?

  • Haskellのリストは、同じ型の要素を複数個格納できる。
  • 違う型の要素を入れることはできない。
  • リストは、要素をカンマ区切りで並べて、角カッコでくくったもの。

 

ghci> let lostNumbers = [4,8,15,16,23,42]
ghci> lostNumbers
[4,8,15,16,23,42]

 

letとは?
  • GHCiの中で名前を定義するときはletキーワードを使う。
  • GHCiでlet a = 1と入力するのは、スクリプトにa = 1と書いて:lでロードするのと同じ。

 

(参考)

https://ghcguide.haskell.jp/users_guide/ghci.html#ghci-introduction

Haskellでは let 式は in をともないます.

しかし,GHCiでは,式は IO モナドの中でも解釈されますので,上の例は in を伴わない let 束縛文であることは,行が表示されないことで示されています.

 

「let」は、「let式」とか「let束縛文」というもののようです。

 

Haskell基礎文法最速マスター - think and error

変数

letで変数を値に束縛します(という言い方をします)。

Prelude> let e = exp 1
Prelude> e
2.718281828459045

一度束縛したら、再代入(再束縛?)等の破壊的操作は出来ません。

 

Swiftで定数を宣言するときの「let」みたいなもんですね?

Haskellのlet式の使い方は、また後で詳しく見てみたいと思います。

 

リストの特徴

整数のリスト、文字のリスト、とかを作れます。

整数や文字など、違うデータ型を混ぜて入れることはできません。

 

リストとタプルの違い

「タプル」という別なデータ構造だと、違う型の要素も格納できます。

 

(参考)リストとタプル - lnzntのHaskell日記 - haskell

 

リストの操作

連結 ++演算子

ghci> [1,2,3,4] ++ [9,10,11,12]
[1,2,3,4,9,10,11,12]

ghci> "hello" ++ " " ++ "world"
"hello World"

ghci> ['w','o'] ++ ['o','t']
"woot"

 

  • Haskellでは、文字列は文字のリストとして表されている。
  • 文字列"hello"はリスト['h','e','l','l','o']と同じ。

 

リストの先頭に追加 :演算子(cons演算子

ghci> 'A':" SMALL CAT"
"A SMALL CAT"

ghci> 5:[1,2,3,4,5]
[5,1,2,3,4,5]

 

 

f:id:hamamuratakuo:20170823153946p:plain

 

リストの先頭から位置を指定して取得 !!演算子

  • リストの要素を先頭からの位置で取得したいときには「!!演算子」を使う。
  • リストの添字は0から数える。

 

ghci> "Steve Buscemi" !! 6
'B'

ghci> [9.4,33.2,96.2,11.2,23.25] !! 1
33.2

 

f:id:hamamuratakuo:20170823210648p:plain

 

リストの比較

  • 中の要素が比較可能であれば、リスト同士も比較可能。
  • <、<=、>=、>を使って2つのリストを比較すると、辞書順で比較される。

 

ghci> [3,2,1] > [2,1,0]
True

ghci> [3,2,1] > [2,10,100]
True

ghci> [3,4,2] < [3,4,3]
True

ghci> [3,4,2] > [2,4]
True

ghci> [3,4,2] == [3,4,2]
True

 

基本的なリスト関数

head関数

head関数はリストを受け取り、そのhead(先頭の要素)を返します。

tail関数

tail関数はリストを受け取り、そのtail(先頭を取り除いた残りのリスト)を返します。

last関数

last関数はリストの最後の要素を返します。

init関数

init関数はリストを受け取り、最後の要素を除いた残りのリストを返します。

 

f:id:hamamuratakuo:20170823224412p:plain

 

null関数

null関数はリストが空かどうかを調べる。

空ならTrueを、空でなければFalseを返す。

 

reverse関数

reverse関数はリストを逆順にする。

 

take関数

take関数は数とリストを取り、先頭から指定された数の要素を取り出したリストを返す。

 

drop関数

drop関数は、指定された数の要素を先頭から削除したリストを返す。

 

maximum関数

maximum関数は、何らかの順序が定義された要素からなるリストを受け取り、その中で最大の要素を返す。

 

minimum関数

minimum関数は最小の要素を返す。

 

sum関数

sum関数は数のリストを受け取り、それらの和を返す。

 

product関数

product関数は数のリストを受け取り、それらの積を返す。

 

elem関数

elem関数は要素とリストを受け取り、それがリストの要素に含まれているかどうかを返す。
elem関数は中置関数として使うと読みやすい。

 

ghci> 4 `elem` [3,4,5,6]
True

ghci> 10 `elem` [3,4,5,6]
False

 

まとめ

Haskellの学習で、リストの操作を最初にやるのは、基本中の基本だからでしょうか?

とりあえず、リストの操作に習熟しておきたいと思います。

 

 

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!