gpt4 book ai didi

raku - map ,嵌套 map 和接收器上下文

转载 作者:行者123 更新时间:2023-12-04 03:19:02 26 4
gpt4 key购买 nike

此代码不返回任何内容

<foo bar ber>.map: { $^a.comb.map: { $^b.say}};

它包含两个 nested maps, both of them in sink context。它不应该工作,因为 a list sunk in a sink context is a no-op

但是,这可行:
<foo bar ber>.map: *.say; # OUTPUT: «foo␤bar␤ber␤»

再次是接收器上下文中的列表。那为什么行得通呢?

最佳答案

map不返回List,而是返回SeqSeq是值的单发oji​​t_code序列,在接收器上下文中,它将迭代其基础迭代器并丢弃产生的值。这就是为什么在接收器上下文中的Iterable会迭代,但深度只有一层的原因。添加map甚至沉入内部值(通过将它们展平为单个顶级序列):

<foo bar ber>.map({ $^a.comb.map: { $^b.say}}).flat # OUTPUT: «f␤o␤o␤b␤a␤r␤b␤e␤r␤»
.flat的确不会在接收器上下文中迭代其值,因为 List是一种数据结构,它甚至可以存储延迟生成的值,以便可以对其进行重复索引。确实,这样做:
(<foo bar ber>.map: *.say).list;

不产生任何输出,因为 List被强制转换为 Seq,在接收器上下文中不执行任何操作。

很少有对可迭代数据的内置操作返回 List,因为这是保留数据的过早 promise 。将这样的操作链接在一起并使数据一次流过它们通常是有用的,而不是在每个中间步骤都将其全部保存在内存中。这就是 List启用的功能,以及为什么这么多东西返回它而不是 Seq的原因。

关于raku - map ,嵌套 map 和接收器上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50423289/

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