2017-01-02 3 views
0

Ich gehe durch die Funktionale Programmierung in Scala (Autor: Paul Chiusano und Runar Bjarnarson), finden Sie unten Erklärung für die Verwendung nicht unter Gesamtfunktion für die Ausnahmebehandlung. Es sagt, wenn wir eine größere Berechnung machen, sollten wir nicht verwenden, was genau damit gemeint ist. Wollen Sie bitte erklären, ein einfaches Beispiel zu geben. Vielen Dank !!Ausnahmebehandlung in Scala Funktionsprogrammierung

enter image description here

Antwort

3

Verwenden Arten von Fehlerfällen zu kommunizieren, anstatt Werte

ein Programm Lets genannt Foo wird die Funktion mean verwenden. Leider lässt sich ein leeres IndexedSeq als Argument an die mean Funktion senden. In diesem Fall mean Funktion würde onEmpty zurückgeben, die ein Double ist.

Da mean ein Double zurückgibt, wenn IndexedSeq leer ist, kann das aufrufende Programm (Foo-Programm) nicht zwischen dem Normalfall (wo die Liste nicht leer ist) und dem undefinierten Fall (Liste ist leer) unterscheiden.

Das Problem mit der Funktion mean es Double in beide undefiniert Fall und Normalfall zurückgibt, wenn die Liste leer ist, nicht.

val someList = List.empty[Double] 

val meanValue = mean(someList, -1) 

if (meanValue == - 1) //undefined case else meanValue 

Die obige Weise mean den undefinierten Wert der Funktion der Überprüfung wird nicht empfohlen.

Der Autor möchte den undefinierten Status mithilfe eines Typs kommunizieren.

Hier ist, wie wir tun können, dass

def mean(list: List[Double]): Option[Double] = { 
    if (list.isEmpty) None 
    else Some(list.sum/list.length) 
} 

Die obige mean Funktion None zurück, wenn undefinierte Fall aufgetreten ist (Liste ist leer) und verlässt sich nicht auf die unsichere Kommunikation einen Wert zurückzugeben.

Foo Programm könnte die Berechnung stoppen, wenn ein nicht definierter Rückkehr ist die Funktion oder meanFoo Programm könnte einen anderen Zweig nehmen, wenn Begegnung durch den undefinierten Wert (Wert, der durch die mean Funktion zurückgegeben, wenn die Liste leer ist). Aber Foo Programm muss auf onEmpty Wert antworten, um für den undefinierten Fall zu überprüfen.

+0

Ja, ich verstehe eine generische Art der Programmierung (d. H. Verwendung von Option), indem Sie nicht auf Programmierer-Eingabe (wie -1, einige kann -5 geben). Aber dieser Weg kann auch mit den Dingen umgehen. Versuchen Sie zu sagen, wir sollten eine allgemeinere Art der Programmierung verwenden, um Fehler zu vermeiden. –

+0

@PriyaranjanSwain verwendet Typen, um Fehlerfälle anstelle von Werten zu kommunizieren – pamu

+0

Sollen 'else list.sum/list.length' nicht' else Some (list.sum/list.length) 'sein? –

1

Stellen Sie sich vor, Ihr Programm kann eine Liste empfangen List(-2.0, 0.0).

val list = List(-2.0, 0.0) 
val theMean = mean(list, -1.0) 

// now I want to handle the error case 
if (theMean == -1.0) 
    println("mean can't be computed!") // wrong! 

Wenn mean würde einigen dummen Standardwert nicht nehmen, aber zurückkehren würde ein Option[Double] oder ein Either[String,Double] oder ... es nicht mehr möglich ist, solch einen Fehler zu machen.

+0

Ja! jetzt bin ich klar. pamu hat eine Aussage gegeben, die eindeutig zu deinem Beispiel passt, d. h. "Typen verwenden, um Fehlerfälle anstatt Werte zu kommunizieren". –