2017-02-12 1 views
0

ich versuche, diesen Code in das CPS Form zu transformieren:Continuation-Übertragungsstil Summe Elemente

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)) 
    } 

Ich bin ein neu zu scala und bekam sehr große Probleme, die Syntax undertand. es wäre sehr hilfreich, wenn Sie einige Syntax geben Sie mir diese Aufgabe

Hier ist mein Code mit einer typ Mismatch zu lösen:

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)) 

Antwort

0

Ein viel einfacher Ansatz zu tun, dass

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)) 

Dies kann auf diese Weise geschrieben werden

foldLeft Methode übergeben Sie den Zähler in jedem Schritt für y ou.

Der einfachste Weg, dies zu tun ist

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

oder

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

EDIT: Aufbau der Berechnung

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)) 

oder

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

Diese Antwort vereitelt den Zweck der Übung, Sie sollen die Fortsetzung durch die gesamte Berechnung führen. – Lee

+0

Das erste Snippet führt genau die Fortsetzung durch – Mikel

+0

Ihr erstes Snippet kompiliert nicht, da 'cont' nirgendwo definiert ist. Wenn es so wäre, hätte es den Typ Int => Einheit, also würde "cont + i" keine Überprüfung geben. Sie berechnen nur die Summe direkt und übergeben sie dann an die Fortsetzung und verwenden sie nicht während des Summenprozesses. – Lee

Verwandte Themen