Seb*_*raf 26 functional-programming rust
随着Rust越来越多地充实,我对它的兴趣开始激起.我喜欢它支持代数数据类型,特别是那些匹配的事实,但是对其他功能习语有什么想法吗?
例如,标准库中是否有标准过滤器/ map/reduce函数的集合,更重要的是,您能否以语法上令人愉悦的方式链接/组合它们[1]?
既然已经有优雅的ADT使用方法,那么monad,特别是一些语法糖呢?
[1] Haskell得到(.)和(>>>),C#扩展方法和可选的LINQ,D具有统一的函数调用语法.
cen*_*lug 24
锈没有HKT的,但是它的迭代器不支持的功能与风格的高阶函数(HOF),如编码map
,filter
,fold
等,以方便链接.
与功能语言相比,细节有所不同 - 通常是垃圾收集,而Rust程序以确定的方式处理内存管理,类似于C++ RAII - 作为程序流程的一部分.
为了实现高效链接,个人HOF的回报组合的慵懒表情模板,你可以通过完成把最终的结果到数据(分配和在一个步骤评估).to_owned_vec()
或.collect()
或什么的.
在某些情况下,这不是必需的,返回的表达式模板本身就是一个迭代器,这可能就足够了.例如,您可以使用循环迭代for
它,或将其作为参数传递给泛型函数.
看到:
C++ 11(带有附加库)和Rust都可以使用类似的模式.Rust的泛型并不像C++模板那么强大,但默认情况下的不变性,面向表达式的语法,多态lambda和双向类型推断使它更接近函数式语言.
关于"扩展方法"和统一调用语法,Rust允许使用类似的"开放世界"组织代码的方式.您可以impl
在库或程序中的任何位置向任何类型添加带有更多方法的s,或者通过在其上实现自己的特征方法来扩展其他库中的现有类型.
这使得使用可链接方法调用样式比在C++中更容易(即不需要修改或派生类型).
请记住,很多Haskell的习语与纯度有关(例如IO monad,镜头......),Rust是多范式的,不是纯粹的功能.您可以在程序级别拥有纯函数以获得引用透明性的好处,但其实现可通过可变局部变量进行简化.