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':[]