bitterharvest’s diary

A Bitter Harvestは小説の題名。作者は豪州のPeter Yeldham。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語

Haskell ドリル5 数のリスト

1.概略

リストはHaskellでは重要な概念である。これまでに数列を学んできたが数列もリストの一つである。1から5までの整数の数列を[1..5]で表したが、これは、1:2:3:4:5:[ ]とも表すことができし、[1,2,3,4,5]とも表すことができる。ここで[ ]は空リストを意味する。リストの終了と考えてもよい。また、要素を並べた後、前者の数列を繋げることも可能である。例えば、1:2:[3..5]あるいは1:2:[3,4,5]は先と同じリストである。しかし、次のような記述 [1..4]:5:[ ]あるいは[1,2,3]:4:5:[ ]は許されない。

Haskellはリストの操作のためにいくつかの関数を用意している。その中のいくつかを示す。
1)headはリストの最初の要素を返す。例えば、init [1..5] は1 を返す。
2)tailはリストの最初の要素を除いたリストを返す。例えば、tail [1..5] は[2,3,4,5]を返す。
3)lastはリストの最後の要素を返す。例えば、last [1..5] は5 を返す。
4)initはリストの最後の要素を除いたリストを返す。例えば、init [1..5] は[1,2,3,4]を返す。
5)++は二つのリストを結合する。例えば、[1..5]++[6..8]は[1,2,3,4,5,,6,7,8]を返す。
6)elemはリストの中にある要素が含まれているかを調べる。あればTrueをなければFalseを返す。例えば、elem 3 [1..5] はTrueを返し、elem 8 [1..5] はFalseを返す。
7):は演算子の一つで、この左側にあるものと右側にあるものでリストを作る。即ち、最初にあるものがそのリストの最初の要素となり、右側にあるものがそれに続くリストとなる。従って出来上がったリストのinitは:の左側にあるものであり、tailは右側にあるものである。
8)reverseは与えられたリストを反転して返す。reverse [1..5] は[5,4,3,2,1]を返す。
9)lengthは要素の数を返す。例えば、length [1..5] は5を返す。

2.例題

問題:init を用いずに[1..5]から最後の要素を取り除いたリストを得る。
リストを反転し、最初の要素を取り除いたリストを反転すると解が得られる。Haskellでは、カッコによってプログラムが分かりにくくなるのを防ぐために、 f ( g x) というプログラムは $ を用いて f $ g x と表すことができる。これを用いると答えは次のようになる。
f:id:bitterharvest:20141209200353p:plain

3.問題

問題1: head $ tail [1..10]を入力すると何が出力されるか?

問題2: init $ tail [1..10] を入力すると何が出力されるか?

問題3: init $ reverse [1..10] を入力すると何が出力されるか?

問題4: elem 1 $ tail $ reverse [1..10] を入力すると何が出力されるか?

問題5: length $ tail $ tail [1..10] を入力すると何が出力されるか?

問題6: init $ tail $ 1:2:3:[1..10] を入力すると何が出力されるか?

問題7: head $ reverse [1,2,3,4,5 ] を入力すると何が出力されるか?

問題8:リスト[1..10]の両端の要素を取り除いた部分リストを得るためにはどうしたらよいか?

問題9: リスト[1..10]の3番目から6番目までの部分リストを得るためにはどうしたらよいか?

問題10:リスト[1..10]の5番目の要素を得るためにはどうしたらよいか?