【问题标题】:Functional Programming in Swit to distribute array elements to correct "buckets"Swit 中的函数式编程以分配数组元素以纠正“桶”
【发布时间】:2016-02-10 03:36:07
【问题描述】:

我是函数式编程的新手。我的问题是我有一个主数组和固定数量的“目标”数组。我想根据每个元素的某个值将主数组中的元素分配到正确的结果数组中。

我猜测一种方法是使用一个映射函数来遍历主要数组元素,确定正确的“目标数组”值(基于某些逻辑),然后将元素添加到该数组中。但是,我不确定这是否非常 FP。毕竟,我正在导致更改我正在映射的主数组外部的数组的副作用。

你会如何在 FP 中正确地做到这一点?

【问题讨论】:

    标签: arrays swift functional-programming higher-order-functions


    【解决方案1】:

    这是我的想法:您可以使用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 谢谢。我的大部分函数经验来自 Mathematica。这是一个很棒的工具。这些天我没有任何东西可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-14
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多