Осторожно! Эта задача требует умения работать с массивами для понимания реализации функции l
(чтобы принять любое число аргументов). Если вы их не знаете, лучше вернуться к этой задаче после прохождения курса "PHP: Массивы", а также курса "PHP: Функции", в котором рассматривается Splat-оператор.
Необходимо реализовать набор функций для работы со списками, построенными на базе строк. Данный вид списка представляет собой текст, где каждая строчка — это элемент списка, например:
hello
world
Это пример списка с двумя элементами hello
и world
.
Подразумевается, что интерфейс работы этой абстракции абсолютно точно такой же, как и тот, что использовался в курсе. Другими словами, можно безболезненно переписать реализацию тех функций, которые делались в курсе, и весь код, использующий списки, будет работать как ни в чем не бывало.
src/Lists.php
Реализуйте следующие функции:
l(...$items)
— функция-конструктор. Уже реализованаtoString($list)
— возвращает строковое представление спискаhead($list)
— возвращает первый элемент спискаtail($list)
— возвращает "хвост" списка (все элементы, кроме первого)isEmpty($list)
— проверяет, является ли список пустымcons($item, $list)
— добавляет элемент в начало списка и возвращает новый списокfilter($list, $predicate)
— фильтрует список, используя предикатmap($list, $callback)
— преобразует список, используя callback-функциюreduce($list, $callback, $init)
— производит свертывание списка
Примеры
<?php
$list = l('foo', 'bar', 'baz');
toString($list); // (foo, bar, baz)
head($list); // 'foo'
tail($list); // l('bar', 'baz')
isEmpty($list); // false
isEmpty(l()); // true
$newList = cons('bas', $list); // l('bas', 'foo', 'bar', 'baz')
$filteredList = filter($list, fn($item) => $item[0] === 'b'); // l('bar', 'baz')
$mappedList = map($list, fn($item) => $item[0]); // l('f', 'b', 'b')
$reducedList = reduce($list, fn($item, $acc) => $acc ? "{$acc},{$item}" : $item, ''); // foo,bar,baz
Примечания
- Решение учителя на 100% функциональное
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.