gpt4 book ai didi

functional-programming - D 中的容器语义和功能风格

转载 作者:行者123 更新时间:2023-12-01 10:58:34 26 4
gpt4 key购买 nike

默认情况下,D 中的容器是否具有值或引用语义?如果它们具有引用语义,那么不会从根本上阻碍在 D 中使用函数式编程风格(与 C++11 的 move 语义相比),例如以下(学术)示例:

auto Y = reverse(sort(X));

其中 X 是一个容器。

最佳答案

容器是否具有值语义或引用语义完全取决于容器。唯一的内置容器是动态数组、静态数组和关联数组。静态数组具有严格的值语义,因为它们位于堆栈上。关联数组具有严格的引用语义。动态数组大多具有引用语义。它们是不会被复制的元素,但它们会被复制,所以它们最终会产生一些特殊的语义。我建议阅读 this article有关更多详细信息,请访问 D 阵列。

对于官方而非内置的容器,std.container 中的容器都有引用语义,一般来说,容器应该是这样的,否则效率很低。但是由于任何人都可以实现自己的容器,因此任何人都可以根据需要创建值类型的容器。

但是,与 C++ 一样,D 并没有走算法对容器进行操作的路线,因此就算法而言,容器是否具有引用语义或值语义几乎无关紧要。在 C++ 中,算法对迭代器进行操作,因此如果您想对容器进行排序,您需要执行类似 sort(container.begin(), container.end()) 的操作。在 D 中,它们对范围进行操作,因此您可以执行 sort(container[])。在这两种语言中,您实际上都不会直接对容器进行排序。因此,容器本身是否具有值或引用语义与您的典型算法无关。

但是,D 在使用算法进行函数式编程方面比 C++ 做得更好,因为范围更适合它。迭代器必须成对传递,这对于链接函数来说效果不是很好。另一方面,Range 可以很好地链接起来,Phobos 利用了这一点。它的主要设计原则之一是它的大部分功能都在范围内运行,以允许您在代码中执行您通常最终在 unix 命令行上使用管道执行的操作,其中您有很多生成输出的通用工具/功能您可以通过管道/传递给其他工具/功能来进行操作,从而允许您链接独立的操作来执行特定于您的需求的操作,而不是依赖某人编写的程序/功能直接完成您想要的操作。 Walter Bright 最近在 this article 中讨论了它.

所以,在 D 中,很容易做类似的事情:

auto stuff = sort(array(take(map!"a % 1000"(rndGen()), 100)));

或者如果您更喜欢 UFCS(通用函数调用语法):

auto stuff = rndGen().map!"a % 1000"().take(100).array().sort();

在任何一种情况下,它都会生成一个由 0 到 1000 之间的 100 个随机数组成的排序列表,并且代码采用函数式风格,C++ 很难做到这一点,而且库在容器而不是迭代器或范围会更难做。

关于functional-programming - D 中的容器语义和功能风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13155587/

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