【发布时间】:2017-01-09 00:08:18
【问题描述】:
我在 Perl 6 中缺少的一件事是 intersperse 函数 like Haskell has:
intersperse 函数接受一个元素和一个列表,并将该元素“穿插”在列表的元素之间。
例如这个:
intersperse <X Y>, (<a b>, <c d>, <e f>);
...应该返回这个序列:
<a b>, <X Y>, <c d>, <X Y>, <e f>
所以我一直在尝试自己将其实现为自定义函数。 为了实现最大的可重用性,它应该:
- 支持任何类型的对象(包括 List 和 Nil)作为元素。
- 不得以任何方式更改元素的容器化。
- 不会以任何方式展平或以其他方式影响元素的内部结构。
- 如果输入列表作为惰性序列给出,则返回惰性序列,以便它可以用于无限序列,如
intersperse 42, 1..Inf。
到目前为止,我想出的是这样的:
sub intersperse (\element, +list) {
((element xx *) Z list).map(|*)[1..*]
}
即:将要穿插的元素无限重复,用list压缩,然后用map到slip每个元组,去掉zip加的嵌套层,不压扁原来的元素,然后使用数组下标删除穿插元素的前导重复。
满足1-3的要求,但不满足4,因为数组下标急切地操作(即完全迭代输入序列,然后返回一个非惰性列表)从而导致这个函数给定无限序列时挂起。
实现此功能以满足所有 4 个要求的好方法是什么?
【问题讨论】:
-
有趣。有点像
List版本的join。
标签: list raku lazy-sequences