2017-02-12 48 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)) 
    } 

我是個新階,並得到非常大的問題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)) 

編輯: 建設計算

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