2017-02-12 101 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