随着 rust 迹越来越多,我开始对它产生兴趣.
例如,在标准库中是否有标准的filter/map/reduce函数集合,更重要的是,您能否以符合语法要求的方式链接/组合它们[1]?
既然ADT已经有了优雅的使用方法,那么单子呢,尤其是一些语法上的糖分呢?
[1] Haskell got (.) and (>>>), C# extension methods and optionally LINQ, D has unified function call syntax.
随着 rust 迹越来越多,我开始对它产生兴趣.
例如,在标准库中是否有标准的filter/map/reduce函数集合,更重要的是,您能否以符合语法要求的方式链接/组合它们[1]?
既然ADT已经有了优雅的使用方法,那么单子呢,尤其是一些语法上的糖分呢?
[1] Haskell got (.) and (>>>), C# extension methods and optionally LINQ, D has unified function call syntax.
Rust没有HKT,但它的迭代器do支持以函数式的方式编码高阶函数(HOF),如map
、filter
、fold
等,并带有方便的链接.
与功能语言相比,这些细节不同,这些通常是垃圾收集,而RIST程序以确定性的方式处理内存管理,类似于C++ + RAI-作为程序流的一部分.
为了实现高效的链接,单个HOF将返回可组合的惰性表达式模板,您可以通过.to_owned_vec()
或.collect()
或其他方式将最终结果转化为数据(一步分配和计算).
在某些情况下,这是不必要的,返回的表达式模板本身就是一个迭代器,这可能就足够了.例如,可以使用for
循环对其进行迭代,或者将其作为参数传递给泛型函数.
见:
一百
一百
类似的模式在C++11(带有附加库)和Rust中都是可能的.RIST的泛型不如C++模板强大,但默认情况下的不可变性、面向表达式的语法、多态性lambdas和双向类型推断使它感觉稍微接近功能语言.
关于"扩展方法"和统一调用语法,Rust允许以类似的"开放世界"方式组织代码.您可以向库或程序中的任何类型添加impl
个具有更多方法的类型,或者通过在其他库上实现您自己的trait方法来扩展现有类型.
这使得使用可链接方法调用样式比C++更容易(即不需要修改或派生类型).
请记住,哈斯凯尔的许多成语都与纯洁有关(例如,IO单子、透镜……),Rust是多范式的,不是纯粹的功能.为了在程序级别实现引用透明性,可以使用纯函数,但它的实现可以通过可变局部变量简化.