함수의 반환값이 다른 함수의 입력값으로 사용되는 것
func f1(_ i: Int) -> Int {
return i * 2
}
func f2(_ i: Int) -> String {
return "\(i)"
}
let result = f2(f1(100))
/// 1급개체로서의 함수를 합성하는 예제
func ff(_ pf1: @escaping (Int) -> Int, _ pf2: @escaping (Int) -> String) -> (Int) -> String {
return { i in // i == 100
// 100 -> 200 -> "200"
return pf2(pf1(i))
}
}
let f3 = ff(f1, f2)
let result2 = f3(100) // 합성된 함수를 한번에 사용
/// generic을 사용해서 합성함수를 생성하는 범용적인 함수를 만들 수 있습니다.
func comp<A, B, C>(_ pf1: @escaping (A) -> B, _ pf2: @escaping (B) -> C) -> (A) -> C {
return { i in
return pf2(pf1(i))
}
}
// 실습
// 짝수 만의 합을 계산하는 코드를 함수의 합성을 이용하여 완성하세요.
func comp2<A, B, C>(_ pf1: @escaping (A) -> B,
_ pf2: @escaping (B) -> C) -> (A) -> C {
return { i in
return pf2(pf1(i))
}
}
func filterEven(_ ns: [Int]) -> [Int] {
//함수를 구현하세요
return ns.filter { $0 % 2 == 0 }
}
func sum(_ ns: [Int]) -> Int {
//함수를 구현하세요
return ns.reduce(0, +)
}
let filteredSum = comp(filterEven, sum)
func solution(_ nums: [Int]) -> Int {
return filteredSum(nums)
}
let f4 = comp(f1, f2)
댓글