gpt4 book ai didi

d - 使用高阶函数在数组中创建重复元素

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

这里是 D 语言的新手。我正在尝试使用高阶函数(即折叠!,减少!,过滤!,映射!)来创建数组元素的重复项。我将我的通用函数声明为纯函数,并尝试以单行函数的形式完成此任务。到目前为止我最接近的是

auto dupList(T)(T[] list) pure { (return map!(a => a.repeat(2)); }

但这给了我以下输出

[[1,1],[2,2]]

而不是我真正想要的

[1, 1, 2, 2]

我像这样调用函数

writeln(dupList(nums));

我一直在尝试使用reduce代替map,但是当我将map换成reduce时,出现以下错误:

Error instantiated from here: `staticMap!(ReduceSeedType, __lambda2)` C:\D\dmd2\src\phobos\std\algorithm\iteration.d 3287
Error: template `D_Programs.duplist!int.duplist.__lambda2` cannot deduce function from argument types `!()(int, int)`, candidates are: C:\D\dmd2\src\phobos\std\algorithm\iteration.d 3696
Error: template instance `D_Programs.duplist!int.duplist.F!(__lambda2)` error instantiating C:\D\dmd2\src\phobos\std\meta.d 803
Error instantiated from here: `reduce!(int[])` D_Programs.d (refers to dupList)
Error `D_Programs.duplist!int.duplist.__lambda2` D_Programs.d (refers to dupList)
Error instantiated from here: `duplist!int` D_Programs.d (refers to where I'm calling from)

任何有关理解至少前三个错误以及我的函数出错的地方的帮助/建议将不胜感激。

最佳答案

map 本质上是用在该元素上调用传递函数的结果替换每个元素。由于您的函数返回一个包含两个 int 的数组,因此结果将是一个数组数组,每个元素包含两个 int

有了这些知识,我们就可以使用 std.algorith.iteration.joiner :

auto dupList(T)(T[] list) pure { return list.map!(a => a.repeat(2)).joiner; }

正如您所注意到的,也应该可以使用reduce,但它有点复杂:

auto dupList(T)(T[] list) pure { return reduce!((a,b) => a~b~b)((T[]).init, list); }

它更复杂的原因是:

1) reduce 的函数接受两个参数 - 到目前为止的归约结果和下一个元素。

2) reduce 假定所传递数组的第一个元素是缩减的起点,除非传递了种子值。由于第一个元素是 T,而不是 T[],因此我们需要传递一个种子值。 [] 不行,因为它的类型为 void[],所以我们需要创建一个空的 T[]。这可以通过 new T[0] 或如上所述的 (T[]).init 来完成。

希望这对您有所帮助 - 如果还有任何问题,请询问! :)

关于d - 使用高阶函数在数组中创建重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52996045/

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