2017-02-12 4 views
0

私はCPSフォームにこのコードを変換しよう:継続渡しスタイルの和の要素

def sum (lst : List [ Int ]) : Int = lst match { 
    case Nil => 0 
    case first :: rest => first + sum (rest) 
    } 


    def sumC1(lst : List [ Int ], k : Int => Unit) : Unit = lst match { 
    case lst => k(sum(lst)) 
    } 

私はスカラ座に新しいMAと非常に大きな問題だが、構文をundertand。

def sum(lst: List[Int])(cont: Int => Int): Int = lst match { 
    case Nil => cont(0) 
    case first :: rest => sum(lst){rest => cont(first + rest) } 
    } 

    def sumC1(lst: List[Int], k: Int => Unit): Unit = lst match { 
    case lst => k(sum(lst)) 
    } 
    sumC1(List(1, 2, 3), (v: Int) => println(v)) 

答えて

0

行うにははるかに単純なアプローチ

def sum(lst: List[Int]): Int = 
    lst.foldLeft(0){ 
     case(cont, i) => cont +i 
    } 
def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(sum(lst)) 

こと:あなたは私にいくつかの構文を与えるかどうかはここで

は、標準のミスマッチと私のコードでこのタスクを解決するために非常に役立つだろうこれは他の方法で書くことができます

def sum(lst: List[Int]): Int = 
    lst.foldLeft(0)(_ + _) 
def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(sum(lst)) 

foldLeftメソッドyの各ステップでカウンタを渡しますou。

これを行う最も簡単な方法は、

def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(lst.sum) 

または

def sum(lst: List[Int]): Int = 
    lst.fold(0)(_ + _) 
def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(sum(lst)) 

EDITです:

def sum(lst: List[Int]): Int = 
    lst.foldLeft[ Int => Int](v => v){ 
     case(cont, i) => v => v + cont(i) 
    }(0) 

def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(sum(lst)) 

または

計算を構築します
def sum(lst: List[Int]): Int = 
    lst.foldLeft[ Unit => Int](Unit => 0){ 
     case(cont, i) => Unit => i + cont() 
    }() 

def sumC1(lst: List[Int], k: Int => Unit): Unit = 
    k(sum(lst)) 
+0

この回答は練習の目的を破っており、計算全体を通して継続をスレッド化しているはずです。 – Lee

+0

最初のスニペットは継続継承を正確に実行しています – Mikel

+0

'cont'がどこにも定義されていないため、最初のスニペットはコンパイルされません。そうであれば、 'Int => Unit'型を持つので、' cont + i'は型チェックを行いません。あなたは合計を直接計算してからそれを継続に渡し、総プロセスをスルーアウトしません。 – Lee

関連する問題