2
我是功能編程的新手。我的問題是我有一個主陣列和固定數量的「目標」數組。我想根據每個元素的特定值將主數組中的元素分配到正確的結果數組中。Swit函數編程來分配數組元素來糾正「桶」
我猜測,一種方法是有一個映射函數,通過主要數組元素,確定正確的「目標數組」值(基於某種邏輯),然後將元素添加到該數組。但是,我不確定這是非常FP。畢竟,我正在改變我所映射的主數組外部的數組的副作用。
您如何在FP中正確執行此操作?
我是功能編程的新手。我的問題是我有一個主陣列和固定數量的「目標」數組。我想根據每個元素的特定值將主數組中的元素分配到正確的結果數組中。Swit函數編程來分配數組元素來糾正「桶」
我猜測,一種方法是有一個映射函數,通過主要數組元素,確定正確的「目標數組」值(基於某種邏輯),然後將元素添加到該數組。但是,我不確定這是非常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:由奇數組號碼/偶
let x = [1,2,3,4]
let y = x.groupBy {
$0 % 2 == 0 ? "even" : "odd"
}
示例2:按長度分組的字符串
let arr1 = ["lorem", "ipsum", "dolor", "sit", "amet"]
let arr2 = arr1.groupBy {
$0.characters.count
}
非常酷!我喜歡你如何不只是簡單地提供解決方案給我的原始問題,而是稍微改變了問題本身,使它的解決方案更加優雅。 – Daniel
@Daniel謝謝。我的大部分功能體驗來自* Mathematica *。這是一個很棒的工具。這幾天我沒有任何東西可以使用它。 –