当前位置: 首页 > 知识库问答 >
问题:

Rust中是否有支持“map”函数(如Haskell)的集合?[复制]

薄腾
2023-03-14

在函数式编程语言中,对集合最原始/基本的操作是同态map;它(大致)是Collection[A]-

Rust 集合似乎不支持这一点。我想这是因为它们是可变的集合;如果您已经在使用可变集合,则就地更新会更有效。

有没有一个单独的“不可变集合”库(就像Scala一样)我错过了?

使用 A- 的“就地映射”操作怎么样

很难使用搜索引擎来回答这个问题,因为所有的点击都涉及“映射”名词(如HashMap)。


共有2个答案

柯树
2023-03-14
匿名用户

要将容器映射到容器,迭代并< code>collect()它们:

vec.iter().map(|x| x * 2).collect::<Vec<_>>();

要就地更改项目,请使用 for 循环并iter_mut()。)。在这种情况下,不鼓励使用迭代器链接,因为修改值会引入副作用。

for x in vec.iter_mut() { 
    x *= 2; 
}

康言
2023-03-14

Rust 有一个 map() 函数,但它不是每个容器的一部分,而是 Trait Iterator 的一部分(Rust 特征与 Haskell 的类型类非常相似):Iterator:map()。。该特征包含许多更有用的方法,其中许多方法对于FP程序员来说应该听起来很熟悉。

让我们看看 map() 的实际应用:

let result: Vec<_> = vec![2, 3, 5, 7]
    .into_iter()      // we have to get an iterator over the vector 
    .map(|i| i * i)   // next we map each element
    .collect();       // finally we collect all elements into a new vector

map() 的类型是你所期望的:

:: Iterator a -> (a -> b) -> Iterator b

或在Rust语法中:

trait Iterator {
    type Item;
    fn map<B, F>(self, f: F) -> Map<Self, F> 
        where F: FnMut(Self::Item) -> B;
}

这首先看起来更复杂,但实际上是有意义的,将来可能会更好。签名是(self, f: F)-

  • selfself::Item[比较:迭代器a]上的一个迭代器
  • F是一个FnMut(Self::Item)-

如果你想做一个原地< code>a -

let mut v = vec![2, 3, 5, 7];
for e in &mut v {
    e *= 2;
}

let mut m = HashMap::new();
m.insert("anna", 5);
m.insert("peter", 3);
for v in m.values_mut() {
    v *= 2;
}

在没有不安全代码的情况下,进行改变类型的就地映射目前是不可能的。部分是因为Rust的类型系统无法在编译时比较两种类型的大小(但它会改变)。

 类似资料:
  • 问题内容: 我想知道是否可以在Go中为未知数量的变量定义函数。 像这样 我想对任意数量的输入进行泛化。 问题答案: 据我所知,您已经了解了很多,但是语法是。见规格: 给定功能并调用 在Greeting中,将具有价值

  • 我对GraphQL的分析解决方案非常感兴趣(想想一个显示图形的webapp)。但我找不到任何使用聚合函数的GraphQL示例。这是我的前端完成的大多数查询的一个主要方面。 对于我的解决方案,我们有3个典型的后端调用。 搜索 假设我们在GraphQL中指定了这种类型 搜寻 GraphQL似乎很好地处理了这一点。毫无疑问。 ex.搜索Bob的年龄{Person(name:"Bob"){age}} 这是

  • 问题内容: 根据这些评论,JSONKit不支持ARC,甚至在ARC环境中都不使用fobjc-no- arc设置运行:https : //github.com/johnezang/JSONKit/issues/37 问题答案: 您仍然可以在ARC应用程序中使用JSONKit。 我自己用的。 在XCode 5中选择项目根目录,在“ 选择应用程序”下,然后选择“ 选项卡”。在JSONKit.m 下,双击

  • 函数组合是将一个函数的输出用作另一个函数的输入的过程。在数学中,合成用表示,其中是一个函数,其输出用作另一个函数(即)的输入。 如果一个函数的输出类型与第二个函数的输入类型匹配,则可以使用这两个函数来实现函数组合。我们使用点运算符()在Haskell中实现函数组合。 看下面的示例代码。演示如何使用函数组合来计算输入数字是偶数还是奇数。 在这里,在函数中,同时调用了两个函数和。编译器将首先以作为参数

  • ; ; ; 在2.中,设3。;因此,应为,,替换为1。,为,应为 但是,应该彼此相等,?如何使两者在GHCi中相互适应,它似乎用或代替了,那么它是如何前进的呢?

  • 在JavaScript中,该代码如下所示: 正如您所看到的,函数组合与JavaScript中的链接方法非常相似。我真的很喜欢链接方法从左到右读取的方式。在Haskell中,我可以使用中的函数和反向函数应用程序执行类似的操作,如下所示: 现在我想用点自由样式来写这个函数。使用函数组合,我将把它写如下: 函数组合的美妙之处在于它可以与自身组合,形成如上所示的“高阶函数组合”。因此,尽管它的类型签名直观