2016-06-21 21 views
1

再帰的列挙型についてもっと学びたいと思っています。ここで素早い再帰的列挙型

は私のコードです:

enum Operation { 
    case Unary((Double) -> Double) 
    case Binary((Double, Double) -> Double) 

    indirect case Combined(Operation, Operation) 
} 

let x = 7.0 
let y = 9.0 
let z = x + y 

let plus = Operation.Binary{$0 + $1} 
let squareRoot = Operation.Unary{sqrt($0)} 

let combined = Operation.Combined(plus, squareRoot) 

switch combined { 
    case let .Unary(value): 
     value(z) 
    case let .Binary(function): 
     function(x, y) 
    case let .Combined(mix): 
     mix(plus, squareRoot) 
} 

にはどうすればいいplus、その後squareRoot操作を次々に実行することができますか?

私はこのエラーを取得しておく:.Unary.Binary

Cannot call value of non-function type (Operation, Operation)

+0

を、 '.Combined'の背後にある意図は何ですか?私。 .Combined(plus、squareRoot)で何が起こると思いますか? – courteouselk

答えて

1

あなたが右のそれをやっています。関数を取得して実行しています。

しかし、.Combinedでは、操作のタプルを取得し、それを関数のように使用しています。あなたがすべきことは、タプル内の関数を取り出して実行することです。代わりに、あなたはこのような再帰関数、使用することができ、あなたのスイッチの

:私は理解できない

func handleOperation(operation: Operation) { 
    switch operation { 
    case let .Unary(value): value(z) 
    case let .Binary(function): function(x, y) 
    case let .Combined(op1, op2): [op1, op2].map(handleOperation) 
    } 
} 
+0

case .map {handle1、op2} .map {handleOperation($ 0)} ここで、[op1、op2]配列要素のそれぞれを引数としてクロージャに渡しますか? – KK7

+0

@ KK7、正確には、 'handleOperation(op1);と同じです。 handleOperation(op2) ' – Daniel

+0

handleOperationはすでに' map'で期待されるクロージャと同じ署名を持っています。あなたはちょうど行うことができます: '... map(handleOperation)' – Alexander

関連する問題