2017-02-12 2 views
0

я пытаюсь преобразовать этот код в виде КПС:Продолжение обгона элементы стиля сумма

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 синтаксис. было бы очень полезно, если бы вы дать мне синтаксис для решения этой задачи

Вот мой код с несоответствием Typ:

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 ОУ.

Самый простой способ сделать это

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

Смежные вопросы