Mustern lassen bedeutung

Muster wie formale Parameter, die nie nicht übereinstimmen, werden als unwiderlegbar bezeichnet, im Gegensatz zu widerlegbaren Mustern, die möglicherweise nicht übereinstimmen. Das Muster, das im obigen Beispiel verwendet wird, ist widerlegbar. Es gibt drei andere Arten von unwiderlegbaren Mustern, von denen wir zwei jetzt einführen werden (die andere werden wir bis Abschnitt 4.4 verzögern). Lazy-Muster sind nützlich in Kontexten, in denen unendliche Datenstrukturen rekursiv definiert werden. Zum Beispiel sind unendliche Listen ein ausgezeichnetes Vehikel für das Schreiben von Simulationsprogrammen, und in diesem Zusammenhang werden die unendlichen Listen oft Als Streams bezeichnet. Betrachten Sie den einfachen Fall der Simulation der Interaktionen zwischen einem Serverprozessserver und einem Clientprozessclient, bei dem der Client eine Folge von Anforderungen an den Server sendet und der Server jede Anforderung mit einer Antwort beantwortet. Diese Situation wird bildlich in Abbildung 2 dargestellt. (Beachten Sie, dass der Client auch eine erste Nachricht als Argument annimmt.) In Haskell ist eine andere Art von Muster erlaubt. Es wird als ein faules Muster bezeichnet und hat die Form .pat. Faule Muster sind unwiderlegbar: Das Abgleich eines Werts v mit dem Wert “pat” ist immer erfolgreich, unabhängig von pat. Wenn ein Bezeichner in pat später auf der rechten Seite “verwendet” wird, wird er an den Teil des Wertes gebunden, der entstehen würde, wenn v pat erfolgreich übereinstimmen würde, andernfalls _|_. Bedeutungsänderung: Erinnern, vergessen, bereuen / stoppen / versuchen / beraten, zulassen, erlauben Wir verwenden mit einem direkten Objekt, das “etwas an jemanden mieten” bedeutet: Leider hat dieses Programm ein ernstes Problem: es wird keine Ausgabe produzieren! Das Problem ist, dass der Client, wie in der rekursiven Einstellung von reqs und resps verwendet, eine Übereinstimmung in der Antwortliste versucht, bevor er seine erste Anforderung gesendet hat! Mit anderen Worten, der Musterabgleich wird “zu früh” durchgeführt.

Eine Möglichkeit, dies zu beheben, besteht darin, den Client wie folgt neu zu definieren: client init resps = init : client (next (head resps)) (tail resps) Obwohl praktikabel, liest sich diese Lösung nicht so gut wie die zuvor angegebene. Eine bessere Lösung ist die Verwendung eines faulen Musters: Client init (resp:resps) = init : client (next resp) resps Da faule Muster unwiderlegbar sind, wird die Übereinstimmung sofort erfolgreich sein, so dass die ursprüngliche Anforderung “übermittelt” werden kann, was wiederum die erste Antwort generieren kann; der Motor ist jetzt “grundiert”, und die Rekursion kümmert sich um den Rest.