Опубликован: 19.09.2008 | Доступ: свободный | Студентов: 658 / 70 | Оценка: 4.50 / 5.00 | Длительность: 21:25:00
Лекция 18:

Утилиты работы со списками

< Лекция 17 || Лекция 18: 123 || Лекция 19 >

17.4. unfoldr

Функция unfoldr является "двойственной" к foldr: тогда как foldr приводит список к суммарному значению, unfoldr строит список из случайного значения. Например:

iterate f == unfoldr (\x -> Just (x, f x))

В некоторых случаях unfoldr может аннулировать операцию foldr:

unfoldr f' (foldr f z xs) == xs

если выполняется следующее:

f' (f x y) = Just (x,y)
  f' z       = Nothing

17.5. Предикаты

isPrefixOf и isSuffixOf проверяют, является ли первый аргумент соответственно приставкой или суффиксом второго аргумента.

17.6. "By"-операции

В соответствии с соглашением, перегруженные функции имеют неперегруженные копии, чьи имена имеют суффикс "By". Например, функция nub могла быть определена следующим образом:

nub              :: (Eq a) => [a] -> [a]
  nub []           =  []
  nub (x:xs)       =  x : nub (filter (\y -> not (x == y)) xs)

Тем не менее, метод сравнения на равенство не может подходить под все ситуации. Функция:

nubBy            :: (a -> a -> Bool) -> [a] -> [a]
  nubBy eq []      =  []
  nubBy eq (x:xs)  =  x : nubBy eq (filter (\y -> not (eq x y)) xs)

позволяет программисту добавлять свою собственную проверку равенства. Когда "By" -функция заменяет контекст Eq бинарным предикатом, предполагается, что предикат определяет эквивалентность; когда "By" -функция заменяет контекст Ord бинарным предикатом, предполагается, что предикат определяет нестрогий порядок.

"By" -вариантами являются следующие: nubBy, deleteBy, deleteFirstsBy (By-вариант \\), unionBy, intersectBy, groupBy, sortBy, insertBy, maximumBy, minimumBy.

Библиотека не обеспечивает elemBy, потому что any (eq x) выполняет ту же работу, что выполняла бы elemBy eq x. Небольшое количество перегруженных функций (elemIndex, elemIndices, isPrefixOf, isSuffixOf) посчитали недостаточно важными для того, чтобы они имели "By" -варианты.

17.7. "generic"-операции

Приставка "generic" указывает на перегруженную функцию, которая является обобщенной версией функции Prelude. Например,

genericLength       :: Integral a => [b] -> a

является обобщенной версией length.

"generic" -операциями являются следующие: genericLength, genericTake, genericDrop, genericSplitAt, genericIndex (обобщенная версия !!), genericReplicate.

17.8. Дополнительные "zip"-операции

Prelude обеспечивает zip, zip3, unzip, unzip3, zipWith и zipWith3. Библиотека List обеспечивает те же три операции для 4, 5, 6 и 7 аргументов.

< Лекция 17 || Лекция 18: 123 || Лекция 19 >