我喜欢Rust支持代数数据类型的事实,特别是这些类型的匹配,但是有没有计划支持其他函数式习惯用法?1.例如,在标准库中是否有一个标准的filter/map/reduce函数的集合,更重要的是,你能以一种语法上令人满意的方式将它们链接/组合起来吗?1.既然已经有一些优雅的方法可以使用ADT,那么monad怎么样,特别是一些语法糖?[1]Haskell得到了(.)和(>),C#扩展方法和可选的LINQ,D有统一的函数调用语法。
00jrzges1#
Rust没有HKT,但它的迭代器 * 确实 * 支持使用高阶函数(霍夫)(如map,filter,fold等)以函数式风格编码,并具有方便的链接。与函数式语言相比,细节有所不同-这些通常是垃圾收集,而Rust程序以确定性的方式处理内存管理,类似于C++ RAII -作为程序流的一部分。为了允许有效的链接,单个霍夫返回可组合的惰性表达式模板,并且您可以通过使用.to_owned_vec()或.collect()或任何其他方法完成,将最终结果转换为数据(在一个步骤中进行分配和计算)。在某些情况下,这是不必要的,返回的表达式模板本身就是一个迭代器,这可能就足够了。例如,你可以用for循环来覆盖它,或者将它作为参数传递给泛型函数。请参阅:
map
filter
fold
.to_owned_vec()
.collect()
for
Rust的泛型没有C模板那么强大,但是默认的不变性、面向表达式的语法、多态的语法和双向类型推理给予了它一种稍微接近函数式语言的感觉。关于“扩展方法”和统一的调用语法,Rust允许类似的“开放世界”的方式来组织代码。你可以在库或程序中的任何地方添加带有更多方法的impl,或者通过在其他库中实现你自己的trait方法来扩展现有的类型。这使得使用可链接的方法调用风格比在C中更容易(即更少需要修改或派生类型)。请记住,Haskell的许多习惯用法都与纯度有关(例如IO monad,lenses..),Rust是多范式的,而不是纯函数的。您可以在程序级别使用纯函数来实现引用透明性,但其实现通过可变的局部变量来简化。
impl
qxsslcnc2#
一个语言必须有“更高类型”来支持像Functors,Applicationatives和Monads这样的概念。换句话说,语言必须能够抽象 * -> * 的类型,或者从类型到类型的函数。Rust目前不支持这种抽象级别。它一直是discussed作为一个可能的未来方向,但我不希望它很快成为焦点。
2条答案
按热度按时间00jrzges1#
Rust没有HKT,但它的迭代器 * 确实 * 支持使用高阶函数(霍夫)(如
map
,filter
,fold
等)以函数式风格编码,并具有方便的链接。与函数式语言相比,细节有所不同-这些通常是垃圾收集,而Rust程序以确定性的方式处理内存管理,类似于C++ RAII -作为程序流的一部分。
为了允许有效的链接,单个霍夫返回可组合的惰性表达式模板,并且您可以通过使用
.to_owned_vec()
或.collect()
或任何其他方法完成,将最终结果转换为数据(在一个步骤中进行分配和计算)。在某些情况下,这是不必要的,返回的表达式模板本身就是一个迭代器,这可能就足够了。例如,你可以用
for
循环来覆盖它,或者将它作为参数传递给泛型函数。请参阅:
Rust的泛型没有C模板那么强大,但是默认的不变性、面向表达式的语法、多态的语法和双向类型推理给予了它一种稍微接近函数式语言的感觉。
关于“扩展方法”和统一的调用语法,Rust允许类似的“开放世界”的方式来组织代码。你可以在库或程序中的任何地方添加带有更多方法的
impl
,或者通过在其他库中实现你自己的trait方法来扩展现有的类型。这使得使用可链接的方法调用风格比在C中更容易(即更少需要修改或派生类型)。
请记住,Haskell的许多习惯用法都与纯度有关(例如IO monad,lenses..),Rust是多范式的,而不是纯函数的。您可以在程序级别使用纯函数来实现引用透明性,但其实现通过可变的局部变量来简化。
qxsslcnc2#
一个语言必须有“更高类型”来支持像Functors,Applicationatives和Monads这样的概念。换句话说,语言必须能够抽象 * -> * 的类型,或者从类型到类型的函数。Rust目前不支持这种抽象级别。它一直是discussed作为一个可能的未来方向,但我不希望它很快成为焦点。