2016-07-03 19 views
1

「Pro swift」ブックの例を見ました。汎用関数としてのオーバーロード演算子

それはオペレータ、最初のパラメータ "LHS" はTをとる関数であるオーバーロードされた - > U.

が、 "generateRandomNumber" 機能がint - >のInt

はどのようにそれは上で動作することができます>> >演算子?

どのように動作しますか?

ありがとうございました。

import Foundation 
infix operator >>> { associativity left } 
func >>> <T, U, V>(lhs: T -> U, rhs: U -> V) -> T -> V { 
    return { rhs(lhs($0)) } 
} 

func generateRandomNumber(max: Int) -> Int { 
    let number = Int(arc4random_uniform(UInt32(max))) 
    print("Using number: \(number)") 
    return number 
} 
func calculateFactors(number: Int) -> [Int] { 
    return (1...number).filter { number % $0 == 0 } 
} 
func reduceToString(numbers: [Int]) -> String { 
    return numbers.reduce("Factors: ") { $0 + String($1) + " " } 
} 

let combined = generateRandomNumber >>> calculateFactors >>> 
reduceToString 
print(combined(100)) 

答えて

1

ジェネリックに関するドキュメントを参照してください。

let combined = generateRandomNumber >>> calculateFactors >>> reduceToString 
print(generateRandomNumber.dynamicType) 
print(calculateFactors.dynamicType) 
print(reduceToString.dynamicType) 
print(combined.dynamicType) 
/* 
Int -> Int 
Int -> Array<Int> 
Array<Int> -> String 
Int -> String 
*/ 
+0

これはわかります。ジェネリック演算子関数は、左の引数をT - > Uとしますが、generateRandomNumberはInt - > Intです。同じ型ではありません。 –

+0

なぜですか?この場合、T === IntとU === Int、それはすべて.... – user3441734

+0

あなたはもっと説明できますか?どのような例ですか?私はジェネリック関数が同じ型を返すようにしようとしました。それはエラーを引き起こした。 "タイプ 'T'の戻り式を 'U'型を返すように変換することはできません" –

関連する問題