在函数式编程语言中,对集合最原始/基本的操作是同态map
;它(大致)是Collection[A]-
Rust 集合似乎不支持这一点。我想这是因为它们是可变的集合;如果您已经在使用可变集合,则就地更新会更有效。
有没有一个单独的“不可变集合”库(就像Scala一样)我错过了?
使用 A- 的“就地映射”操作怎么样
?
很难使用搜索引擎来回答这个问题,因为所有的点击都涉及“映射”名词(如
HashMap
)。
匿名用户
要将容器映射到容器,迭代并< code>collect()它们:
vec.iter().map(|x| x * 2).collect::<Vec<_>>();
要就地更改项目,请使用 for 循环并iter_mut()。
)。在这种情况下,不鼓励使用迭代器链接,因为修改值会引入副作用。
for x in vec.iter_mut() {
x *= 2;
}
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)-
self
是self::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中,我可以使用中的函数和反向函数应用程序执行类似的操作,如下所示: 现在我想用点自由样式来写这个函数。使用函数组合,我将把它写如下: 函数组合的美妙之处在于它可以与自身组合,形成如上所示的“高阶函数组合”。因此,尽管它的类型签名直观