随着 rust 迹越来越多,我开始对它产生兴趣.

  1. 例如,在标准库中是否有标准的filter/map/reduce函数集合,更重要的是,您能否以符合语法要求的方式链接/组合它们[1]?

  2. 既然ADT已经有了优雅的使用方法,那么单子呢,尤其是一些语法上的糖分呢?

[1] Haskell got (.) and (>>>), C# extension methods and optionally LINQ, D has unified function call syntax.

推荐答案

Rust没有HKT,但它的迭代器do支持以函数式的方式编码高阶函数(HOF),如mapfilterfold等,并带有方便的链接.

与功能语言相比,这些细节不同,这些通常是垃圾收集,而RIST程序以确定性的方式处理内存管理,类似于C++ + RAI-作为程序流的一部分.

为了实现高效的链接,单个HOF将返回可组合的惰性表达式模板,您可以通过.to_owned_vec().collect()或其他方式将最终结果转化为数据(一步分配和计算).

在某些情况下,这是不必要的,返回的表达式模板本身就是一个迭代器,这可能就足够了.例如,可以使用for循环对其进行迭代,或者将其作为参数传递给泛型函数.

见:

  • 一百

  • 一百

类似的模式在C++11(带有附加库)和Rust中都是可能的.RIST的泛型不如C++模板强大,但默认情况下的不可变性、面向表达式的语法、多态性lambdas和双向类型推断使它感觉稍微接近功能语言.

关于"扩展方法"和统一调用语法,Rust允许以类似的"开放世界"方式组织代码.您可以向库或程序中的任何类型添加impl个具有更多方法的类型,或者通过在其他库上实现您自己的trait方法来扩展现有类型.

这使得使用可链接方法调用样式比C++更容易(即不需要修改或派生类型).

请记住,哈斯凯尔的许多成语都与纯洁有关(例如,IO单子、透镜……),Rust是多范式的,不是纯粹的功能.为了在程序级别实现引用透明性,可以使用纯函数,但它的实现可以通过可变局部变量简化.

Rust相关问答推荐

计算具有相邻调换且没有插入或删除的序列的距离

通过使用光标拖动角来绕其中心旋转矩形

在执行其他工作的同时,从共享裁判后面的VEC中删除重复项

如何go 除铁 rust 中路径组件的第一项和最后一项?

有没有办法指定只在Rust的测试中有效的断言?

像这样的铁 rust 图案除了‘选项’之外,还有其他 Select 吗?

使用极点数据帧时,找不到枚举结果的方法lazy()

无法定义名为&new&的关联函数,该函数的第一个参数不是self

如何将单个 struct 实例与插入器一起传递到Rust中的映射

不同类型泛型的映射

.在 Rust 模块标识符中

提取指向特征函数的原始指针

将引用移动到线程中

如何判断服务器是否正确接收数据

仅在运行测试时生成调试输出

SDL2 没有在终端键上触发?

从函数返回 u32 的数组/切片

有没有办法阻止 rust-analyzer 使非活动代码变暗?

HashMap entry() 方法使borrow 的时间比预期的长

在 Rust 中组合特征的不同方法是否等效?