/ Will Rust是否支持函数式编程习语?

Seb*_*raf 26 functional-programming rust

随着Rust越来越多地充实,我对它的兴趣开始激起.我喜欢它支持代数数据类型,特别是那些匹配的事实,但是对其他功能习语有什么想法吗?

  1. 例如,标准库中是否有标准过滤器/ map/reduce函数的集合,更重要的是,您能否以语法上令人愉悦的方式链接/组合它们[1]?

  2. 既然已经有优雅的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是多范式的,不是纯粹的功能.您可以在程序级别拥有纯函数以获得引用透明性的好处,但其实现可通过可变局部变量进行简化.

  • traits用于运行时和编译时多态; 它们就像提出的C++概念(为更好的编译时错误绑定模板参数),或者你可以实例化一个'trait-object',在这种情况下,trait用于格式化vtable.像C++一样,如果你明确地要求它,你只能得到一个vtable. (2认同)

MFl*_*mer 16

语言必须具有"更高级的类型"才能支持Functors,Applicatives和Monads等概念.换句话说,语言必须能够抽象出* - >*的类型,或者从类型到类型的函数.Rust目前不支持这种抽象级别.它已被讨论为未来可能的方向,但我不认为它会很快成为焦点.

  • C#通过LINQ支持Monads.IEnumerable <T>和IObservable <T>都是monadic/linqable.但是C#不支持更高的kinded类型,所以我不确定这个答案中的断言是否正确.也许你的意思是稍微具体一些. (2认同)