gpt4 book ai didi

list - 如何在 Perl 6 中编写 `intersperse` 函数

转载 作者:行者123 更新时间:2023-12-04 11:02:35 25 4
gpt4 key购买 nike

我在 Perl 6 中缺少的一件事是 intersperse功能 like Haskell has :

The intersperse function takes an element and a list and `intersperses' that element between the elements of the list.



例如。这个:
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压缩,然后用 mapslip每个元组,以便在不压平原始元素的情况下去除zip添加的嵌套层,然后使用数组下标去除穿插元素的前导重复。

    它满足要求 1-3,但不满足 4,因为数组下标急切地操作(即完全迭代输入序列,然后返回一个非惰性列表),因此在给定无限序列时导致此函数挂起。

    实现此功能以满足所有 4 个要求的好方法是什么?

    最佳答案

    我对我提出的解决方案并不是特别满意,但它们是这样的:

    sub intersperse (\element, +list) {
    map { ((element xx *) Z list).map(|*)[$_] },
    1..(list.is-lazy ?? Inf !! list.elems * 2 - 1);
    }
    sub intersperse (\element, +list) {
    gather for list {
    FIRST .take, next;
    take slip element, $_;
    }
    }
    sub intersperse (\element, +list) {
    list.map({ slip element, $_ }) does role {
    method iterator {
    my \it = callsame;
    it.pull-one;
    it;
    }
    }
    }

    也许它会激励其他人想出更好的东西......

    关于list - 如何在 Perl 6 中编写 `intersperse` 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39265900/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com