На этом шаге мы рассмотрим функционалы этого типа.
Перечислим функционалы этой группы.
1. Функционал, возвращающий список элементов исходного списка, для которых заданный предикат является истинным:
filter:: (a -> Bool) -> [a] -> [a] filter p lst
> filter null [[2],[3,3],[],[5,4],[],[2]] [[],[]] > filter (elem 3) [[2],[3,3],[],[5,4,3],[],[3]] [[3,3],[5,4,3],[3]] > filter (0>) [2,3,4,(-4),9,(-1)] [-4,-1]
2. Функционал, возвращающий список элементов из начала исходного списка до тех пор, пока они удовлетворяют заданному предикату:
takeWhile:: (a -> Bool) -> [a] -> [a] takeWhile p lst
> takeWhile (0<) [2,3,4,-4,9,-1,11,21] [2,3,4] > takeWhile (elem (-2)) [[1,-2,2],[-2],[4],[-2,-2]] [[1,-2,2],[-2]] > takeWhile (elem 7) [[2,3],[3,7,6],[9,7]] []
3. Функционал, удаляющий элементы из начала списка до тех пор, пока они удовлетворяют заданному предикату (англ. drop - отбрасывание):
dropWhile:: (a -> Bool) -> [a] -> [a] dropWhile p lst
> dropWhile (0<) [2,3,4,-4,9,-1,11,21] [-4,9,-1,11,21] > dropWhile (elem (-2)) [[1,-2,2],[-2],[4],[-2,-2]] [[4],[-2,-2]]
4. Функционал, разделяющий исходный список на два и возвращающий пару, содержащую полученные списки. В первый список поступают элементы из начала исходного списка, которые удовлетворяют заданному предикату, во второй - оставшиеся элементы исходного списка:
span:: (a -> Bool) -> [a] -> ([a],[a]) span p lst
> span (0>=) [-3,-4,1,0,-2,3,4,10,-2] > span null [[],[],[]] ([-3,-4],[1,0,-2,3,4,10,-2]) ([[],[],[]],[]) > span (0>=) [3,4,1,0,-2,3,4,10,-2] ([],[3,4,1,0,-2,3,4,10,-2])
break:: (a -> Bool) -> [a] -> ([a], [a]) break p lst
В том случае, если предикат не выполняется ни для одного из элементов, то первым элементом кортежа является исходный список, а вторым - пустой список. Например:
> break (0>=) [3,4,1,0,-2,3,4,10,-2] > break (0<) [-1,-2] ([3,4,1],[0,-2,3,4,10,-2]) ([-1,-2],[]) > break ('a'==) ['b','c','a','d','e'] ("bc","ade")
На следующем шаге мы рассмотрим функционалы-конструкторы.