随着Rust变得越来越充实,我对它的兴趣开始激起。 我喜欢它支持代数数据类型,特别是那些匹配的事实, 但对其他功能习语是否有任何想法?
E.g。标准库中是否有标准过滤器/ map / reduce函数的集合,更重要的是,你能以语法上令人愉悦的方式链接/组合它们吗?[1]?
既然已经有优雅的ADT使用手段,那么monad,特别是一些语法糖呢?
[1] Haskell得到(。)和(>>>),C#扩展方法和可选的LINQ,D具有统一的函数调用语法。
答案 0 :(得分:23)
Rust没有HKT,但它的迭代器做支持具有更高阶函数(HOF)的函数式编码,如map
,filter
,{{1方便链接。
与功能语言相比,细节有所不同 - 通常是垃圾收集,而Rust程序以确定的方式处理内存管理,类似于C ++ RAII - 作为程序流程的一部分。
为了实现高效链接,单个HOF返回可组合的延迟表达式模板,您可以通过使用fold
或.to_owned_vec()
或其他任何内容将最终结果转换为数据(一步分配和评估) 。
在某些情况下,这不是必需的,返回的表达式模板本身就是一个迭代器,这可能就足够了。例如,您可以使用.collect()
循环对其进行迭代,或将其作为参数传递给泛型函数。
请参阅:
C ++ 11(带有附加库)和Rust都可以使用类似的模式。 Rust的泛型并不像C ++模板那么强大,但默认情况下的不变性,面向表达式的语法,多态lambda和双向类型推断使它更接近函数式语言。
关于“扩展方法”和统一调用语法,Rust允许使用类似的“开放世界”组织代码的方式。您可以将更多方法的for
添加到库或程序中任何类型的任何类型,或者通过在它们上实现您自己的特征方法来扩展其他库中的现有类型。
这使得使用可链接方法调用样式比在C ++中更容易(即不需要修改或派生类型)。
请记住,很多Haskell的习语与纯度有关(例如IO monad,镜头......),Rust是多范式的,不是纯粹的功能。您可以在程序级别使用纯函数来实现引用透明性的好处,但它的实现可以通过可变局部变量进行简化。
答案 1 :(得分:16)
语言必须具有“更高级的类型”才能支持Functors,Applicatives和Monads等概念。换句话说,语言必须能够抽象出* - >类型。 *,或从类型到类型的函数。 Rust目前不支持这种抽象级别。它已经discussed作为未来可能的方向,但我不认为它会很快成为焦点。