IT練習ノート

IT関連で調べたこと(実際は嵌ったこと)を書いています。

99 questions problem 3

リストの要素を1始まりで取得する関数の作成で、NG場合。

*Main> last $ take 1 ['a','b','c','d','e']
'a'
*Main> last $ take 2 ['a','b','c','d','e']
'b'
*Main> last $ take 3 ['a','b','c','d','e']
'c'
*Main> last $ take 4 ['a','b','c','d','e']
'd'
*Main> last $ take 5 ['a','b','c','d','e']
'e'
*Main> -- ここまではOK
*Main> last $ take 6 ['a','b','c','d','e']
'e'
*Main> -- 正しくない
*Main> last $ take 7 ['a','b','c','d','e']
'e'
*Main> -- 正しくない
*Main> 

takeは、配列の要素数を超える数を指定した場合は、もともとの配列となるため。

takeの実装を確認すると

take n _      | n <= 0 =  []
take _ []              =  []
take n (x:xs)          =  x : take (n-1) xs

再帰していて、要素を一つずつとって、インデックスがゼロ以下か、配列の要素数がゼロになったときに[]をつけて終了している。

例えば、

take 5 ['a','b','c'] 
= 'a' : take 4 ['b','c']
= 'a':'b' : take 3 ['c']
= 'a':'b':'c' take 2 []
= 'a':'b':'c':[]