Slide 60
Slide 60 text
func fac(_ n: Int) -> Int {
//
⚠
ඌ࠶ؼͷܗͰͳ͍ʢ͕ɺཪͰίϯύΠϥ͕࠷దԽͯ͘͠ΕΔʣ
return n == 0 ? 1 : n * fac (n - 1)
}
// `cpsTransform` ΛΘͣɺखॻ͖ͰܧଓʹΑΔඌ࠶ؼ
func facCPS(_ n: Int, _ next: Int -> R) -> R {
return n == 0 ? next(1) : facCPS(n - 1, { next(n * $0) })
}
// `cpsTransform` Λͬͨ߹ʢඌ࠶ؼ࠷దԽʣ
let facCPSAuto: (Int -> Int) -> Int -> Int = cpsTransform(fac)
facCPS(4, id) // 24 ʢखಈͰඌ࠷దʣ
facCPSAuto(id)(4) // 24 ʢࣗಈͰඌ࠷దʣ