官术网_书友最值得收藏!

Higher-order functions

As we have seen in the Defining and using function parameters and Function types sections of this chapter, functions can accept functions as parameters in Swift. Functions that can accept other functions as parameters are called higher-order functions. This concept, along with first-class functions, empowers FP and function decomposition.

As this topic is essential in FP, we will go through another simple example.

Suppose that we need to develop two functions that add and subtract two Int values as follows:

func subtractTwoValues(a: Int, b: Int) -> Int { 
return a - b
}

func addTwoValues(a: Int, b: Int) -> Int {
return a + b
}

Also, we need to develop functions to calculate the square and triple of two Int values as follows:

func square(a: Int) -> Int { 
return a * a
}

func triple(a: Int) -> Int {
return a * a * a // or return square(a) * a
}

Suppose we need another function that subtracts the two squared values:

func subtractTwoSquaredValues(a: Int, b: Int) -> Int { 
return (a * a) - (b * b)
}

In case we needed to add two squared values:

func addTwoSquaredValues(a: Int, b: Int) -> Int { 
return (a * a) + (b * b)
}

Let's say that we need another function that triples a value and multiplies it with another tripled value:

func multiplyTwoTripledValues(a: Int, b: Int) -> Int { 
return (a * a * a) * (b * b * b)
}

This way, we had to write a lot of redundant and inflexible functions. Using higher-order functions, we could write a flexible function as follows:

typealias AddSubtractOperator = (Int, Int) -> Int 
typealias SquareTripleOperator = (Int) -> Int

func calculate(a: Int,
b: Int,
funcA: AddSubtractOperator,
funcB: SquareTripleOperator) -> Int {
return funcA(funcB(a), funcB(b))
}

This higher-order function takes two other functions as parameters and uses them. We can call it for different scenarios as follows:

print("The result of adding two squared values is: \(calculate(a: 2, b: 2, funcA: addTwoValues, funcB: square))")  
// prints "The result of adding two squared value is: 8"

print("The result of subtracting two tripled value is: \(calculate(a: 3, b: 2, funcA: subtractTwoValues, funcB: triple))")
// prints "The result of adding two tripled value is: 19"

This simple example presented the utility of higher-order functions in function composition and subsequently in program modularity.

主站蜘蛛池模板: 朔州市| 柘荣县| 开平市| 鄂伦春自治旗| 万山特区| 萨嘎县| 西昌市| 阆中市| 都昌县| 明水县| 元氏县| 麻阳| 织金县| 乐平市| 麦盖提县| 泉州市| 开鲁县| 镇江市| 景宁| 高唐县| 科技| 渭南市| 晋江市| 永城市| 谢通门县| 黎城县| 大石桥市| 文登市| 陇南市| 多伦县| 鞍山市| 兴国县| 潮安县| 沙坪坝区| 海口市| 靖边县| 措勤县| 英山县| 内黄县| 大田县| 南开区|