有一件事我一直在Perl 6的失蹤,是intersperse
功能like Haskell has:如何在Perl寫的`intersperse`功能6
的點綴功能需要的元素與列表和'點綴列表元素之間的元素。
例如,這樣的:
intersperse <X Y>, (<a b>, <c d>, <e f>);
...應該返回序列:
<a b>, <X Y>, <c d>, <X Y>, <e f>
所以我一直在試圖實現它自己作爲一個自定義的功能。 爲了獲得最大的可重用性,它應:
- 支持任何類型的對象(包括列表和無)作爲要素。
- 不以任何方式改變元素的集裝箱化。
- 不以任何方式展平或以其他方式影響元素的內部結構。
- 如果輸入列表是作爲惰性序列給出的,則返回一個惰性序列,以便它可以在無限序列上使用,如
intersperse 42, 1..Inf
中所述。
我想出到目前爲止,是這樣的:
sub intersperse (\element, +list) {
((element xx *) Z list).map(|*)[1..*]
}
即:無限重複的元素穿插,與列表拉鍊,然後使用map
到slip
每個元組以便除去由zip添加的嵌套層而不壓扁原始元素,然後使用數組下標來消除散佈元素的前導重複。
它滿足要求1-3,但不是4,因爲數組下標急於操作(即完全迭代輸入序列,然後返回一個非惰性列表)因此導致此函數在給定無限序列。
什麼是一個很好的方式來實現這個功能,以滿足所有4個要求?
Inter esting。有點像'join'的List列表版本。 –