func memoize<T: Hashable, U>( body: ((T)->U, T)->U ) -> (T)->U { var memo = Dictionary<T, U>() var result: ((T)->U)! result = { x in if let q = memo[x] { return q } let r = body(result, x) memo[x] = r return r } return result } let factorial = memoize { factorial, x in x == 0 ? 1 : x * factorial(x - 1) } println(factorial(5))