Recursion duckmap到底做什么?

Recursion duckmap到底做什么?,recursion,functional-programming,raku,map-function,duck-typing,Recursion,Functional Programming,Raku,Map Function,Duck Typing,从 duckmap将对每个元素应用&block,并返回一个新列表,其中包含已定义的块返回值。对于未定义的返回值,duckmap将尝试下降到元素中,如果该元素实现了Iterable 但是: my $list = [[1,2,3],[[4,5],6,7]]; say $list.deepmap( *² ); # [[1 4 9] [[16 25] 36 49]] say $list.duckmap( *² ); # [9 9] 行为与预期相当,但我真的无法理解duckmap在做什么 这个问题涉及

duckmap
将对每个元素应用
&block
,并返回一个新列表,其中包含已定义的块返回值。对于未定义的返回值,
duckmap
将尝试下降到元素中,如果该元素实现了
Iterable

但是:

my $list = [[1,2,3],[[4,5],6,7]];

say $list.deepmap( *² ); # [[1 4 9] [[16 25] 36 49]]
say $list.duckmap( *² ); # [9 9]
行为与预期相当,但我真的无法理解
duckmap
在做什么


这个问题涉及到。这可以通过“他们再也不同不过了”来解决,但我想找到一些例子,说明他们做了同样的事情,而当他们没有做的时候,试着去理解到底发生了什么

duckmap
只有在数组上无法调用
&block
时才会深入。
$\
可以是
->${$\}
中的数组

试一试

在那里,
duckmap
深入。

duckmap中的duck指的是duck类型;那就是“如果它走路像鸭子,说话像鸭子,它一定是鸭子。”

>说[1,2.2,“3.4”,4,“a”].duckmap(->Str${use fatal;.Int}).perl
[1,2.2,3,4,“a”]
use fatal
的存在使得
“a”.Int
失败对象成为抛出的异常,从而
duckmap
捕获它并返回原始数据)

这对于更改输入的小部分非常有用,而无需专门处理每个可能的输入

>说[1,2.2,“3.4”,4,“a”].map(->${$\ustr???.Int/.self!!.self}).perl
[1,2.2,3,4,“a”]
>说[1,2.2,“3.4”,4,“a”].deepmap(->${${$\~~Str???.Int/.self!!.self}).perl
[1,2.2,3,4,“a”]
duckmap
和其他
map
s之间有更多的区别,但是它们都是为了这个基本前提而存在的


[[],[1,2,3],[4,5,6],]].duckmap(->@where.all~~Int{@uuu.Str}).perl
[“a”、“b”、“c”]、“1 2 3”、“4 5 6”]
>[[],[1,2,3],[4,5,6],].map(->@{uuuu0.all~~Int???u0.Str!!@@u0.self}).Array.perl
[[a]、[b]、[c]、[1 2 3]、[4,5,6]、][]#不匹配,因为地图只有一层深
(请注意,使用
deepmap
,您根本无法执行上述操作,因为它太深了)

为了从
map
中获得相同的行为,可能需要更多的工作。

子列表中的
[9,9]
正在平方元素计数。尝试添加或删除要检查的元素。除了其他有用的答案外,文档工作还可以找到感兴趣的S32 list/duckmap.t:
say $list.duckmap( -> Int $_ {$_²} ); #returns [[1 4 9] [[16 25] 36 49]]