Одна вещь, которую я пропускал в Perl 6, является intersperse
функция like Haskell has:Как написать `intersperse` функцию в Perl 6
Функция пересыпать принимает элемент и список и` вкрапляет этот элемент между элементами списка.
E.g. это:
intersperse <X Y>, (<a b>, <c d>, <e f>);
... должен вернуть эту последовательность:
<a b>, <X Y>, <c d>, <X Y>, <e f>
Так что я пытался реализовать себя в качестве пользовательской функции. Для максимального повторного использования, он должен:
- Поддержка любого типа объекта (в том числе и список Nil) в качестве элементов.
- Не меняйте контейнеризацию элементов в любом случае.
- Не сглаживать или иным образом влиять на внутреннюю структуру элементов.
- Верните ленивую последовательность, если входной список задан как ленивая последовательность, так что его можно использовать в бесконечных последовательностях, как в
intersperse 42, 1..Inf
.
То, что я придумал до сих пор, это:
sub intersperse (\element, +list) {
((element xx *) Z list).map(|*)[1..*]
}
То есть: Бесконечно повторять элемент перемежаться, пронестись его со списком, а затем использовать map
для slip
каждого кортежа чтобы удалить слой вложенности, добавленный zip, без выравнивания исходных элементов, а затем использовать индекс массива, чтобы удалить ведущее повторение вкрапленного элемента.
Он удовлетворяет требования 1-3, но не 4, так как индекс массива работает охотно (т.е. полностью перебирает последовательность ввода, а затем возвращает не ленивый List) и, таким образом, вызывает эту функцию, чтобы повиснуть при дан бесконечная последовательность.
Что было бы хорошим способом реализовать эту функцию, чтобы она удовлетворяла всем 4 требованиям?
Inter esting. Вид вроде 'List' версии' join'. –