Swift 中的函数式编程以分配数组元素以更正 "buckets"
Functional Programming in Swit to distribute array elements to correct "buckets"
我是函数式编程的新手。我的问题是我有一个主数组和固定数量的 "destination" 数组。我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中。
我猜测一种方法是使用一个映射函数遍历主要数组元素,确定正确的 "destination array" 值(基于某种逻辑),然后将元素添加到该数组.但是,我不确定这是不是很 FP。毕竟,我导致了改变我正在映射的主数组外部的数组的副作用。
你会如何在 FP 中正确地做到这一点?
这是我的想法:您可以使用 reduce
来消除副作用。与其事先创建数组,不如创建一个数组字典。
例如,下面是一个扩展,它允许您通过应用函数对原始数组的元素进行分组:
extension Array {
func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] {
return self.reduce([T: [Element]]()) { (var aggregate, element) in
let key = f(element)
if aggregate[key] != nil {
aggregate[key]!.append(element)
} else {
aggregate[key] = [element]
}
return aggregate
}
}
}
示例 1:按 odd/even
对数字进行分组
let x = [1,2,3,4]
let y = x.groupBy {
[=11=] % 2 == 0 ? "even" : "odd"
}
示例 2:按长度对字符串进行分组
let arr1 = ["lorem", "ipsum", "dolor", "sit", "amet"]
let arr2 = arr1.groupBy {
[=12=].characters.count
}
我是函数式编程的新手。我的问题是我有一个主数组和固定数量的 "destination" 数组。我想根据每个元素的特定值将主数组中的元素分配到正确的结果数组中。
我猜测一种方法是使用一个映射函数遍历主要数组元素,确定正确的 "destination array" 值(基于某种逻辑),然后将元素添加到该数组.但是,我不确定这是不是很 FP。毕竟,我导致了改变我正在映射的主数组外部的数组的副作用。
你会如何在 FP 中正确地做到这一点?
这是我的想法:您可以使用 reduce
来消除副作用。与其事先创建数组,不如创建一个数组字典。
例如,下面是一个扩展,它允许您通过应用函数对原始数组的元素进行分组:
extension Array {
func groupBy<T: Hashable>(f: Element -> T) -> [T: [Element]] {
return self.reduce([T: [Element]]()) { (var aggregate, element) in
let key = f(element)
if aggregate[key] != nil {
aggregate[key]!.append(element)
} else {
aggregate[key] = [element]
}
return aggregate
}
}
}
示例 1:按 odd/even
对数字进行分组let x = [1,2,3,4]
let y = x.groupBy {
[=11=] % 2 == 0 ? "even" : "odd"
}
示例 2:按长度对字符串进行分组
let arr1 = ["lorem", "ipsum", "dolor", "sit", "amet"]
let arr2 = arr1.groupBy {
[=12=].characters.count
}