-5

リストからk番目の要素を選択したい場合、そのように関数を呼び出すことができます

selectN 5 aList

そして私が持っている機能

selectN :: Int -> a -> a
selectN 1 (x:_) = x
selectN [] _     = error "Index out of bounds"
selectN k (_:xs) 
  | n < 1           = error "Index out of bounds"
  | otherwise       = selectN xs (n - 1)
4

2 に答える 2

1

リストの k 番目の要素を選択するには、 を使用します!!。最初の要素はインデックスです0

selectN = (!!)

ghci> let test = "abracadabra"
ghci> test !! 0   
ghci> 'a'
ghci> test !! 9
ghci> 'r'

indexOutOfRangeただし、例外に注意してください

ghci> test !! 11 
*** Exception: Prelude.(!!): index too large

編集 : 関数を安全にする

エラー例外を処理するために a を記述してsafeSelectN、プログラムが何もせずに安全に続行できるようにすることができますIO。そのためには、次の変更が必要です

safeSelectN :: Int -> [a] -> [a]
safeSelectN n xs = if null xs || length xs < n then [] else [xs !! n]

この場合、結果として空のリストを受け取ることでエラーが検出されます。

ghci> safeSelectN 3 ""
[]
ghci> safeSelectN 0 ""
[]
ghci> safeSelectN 3 "abcd" --like this
['d']

したがって、結果が正しい場合、k 番目の要素だけではなく、k 番目の要素のみを含むリストになります。

于 2012-12-08T03:26:36.460 に答える