wie könnte ich mehrere Werte aus einer Funktion in haskell zurückgeben?

9

Hifriends  ist es möglich, dass Funktion mehrere Werte (z. B. String und Boolean) zurückgibt?  Wenn ja, dann habe ich eine Funktion namens concat, die einen Booleschen Wert und eine Zeichenkette zurückgibt, aber ich weiß nicht, wie ich diese Funktionen aufrufen soll, weil ich sie speichern möchte. Ich habe einen sehr großen Code geschrieben. Daher kann ich es nicht veröffentlichen.% Co_de%

%Vor%

Können Sie mir helfen, die Funktionssignatur zu schreiben und diese Funktionen aufzurufen?

ich brauche nur einen Prototyp

Danke

    
rahul 30.07.2014, 17:19
quelle

2 Antworten

9

Wenn Sie mehrere Werte zurückgeben, müssen Sie einen algebraischen Datentyp zurückgeben. Es kann viel dazu gesagt werden, ich werde dir einige Vorschläge machen.

  1. Wenn Ihre Bool und String irgendwie zusammenhängender sind und in Ihrem Code oft zusammen vorkommen, definieren Sie einen neuen algebraischen Datentyp:

    %Vor%

    Sie können es auch mit Accessor-Funktionen definieren, die auch die Daten dokumentieren:

    %Vor%

    und Sie können eine Funktion e definieren. G. zur Initialisierung der Frage:

    %Vor%

    oder (für verbesserte Dokumentation):

    %Vor%

    Dann können Sie mit Ihren Daten mit dem Datenkonstruktor arbeiten:

    %Vor%

    oder Verwendung der Accessor-Funktionen (viele Kombinationen der beiden Ansätze sind möglich):

    %Vor%

    Beispiel für den Aufruf der Funktionen:

    %Vor%
  2. Wenn Sie keinen neuen Datentyp definieren möchten, verwenden Sie ein vordefiniertes Eintupel. In Standardbibliotheken sind viele Funktionen definiert, die Ihnen die Arbeit mit Tupeln erleichtern. Verwenden Sie die Tupel jedoch nicht überall - größerer Code würde zu einem Durcheinander führen (fehlende Dokumentation - es ist nicht klar, welche Daten das Tupel darstellt), Typfehler wären aufgrund von Polymorphie nicht so einfach zu verfolgen.

    Ein Beispiel für eine bequeme Verwendung von Tupeln:

    %Vor%

    Zu viel gesagt über diese einfache Frage, aber da ich die Standardbibliotheksunterstützung als Hauptvorteil von Tupeln erwähnt habe, werde ich das letzte Beispiel geben, das uncurry function from Prelude verwendet:

    %Vor%
pallly 30.07.2014, 21:50
quelle
10

Ja, Sie können mehrere Werte mit einem Hakkel-Konstrukt namens Tupel zurückgeben.

Hier ist ein einfaches Beispiel

%Vor%

Sie können dann auf den ersten Teil des Tupels mit fst und auf den zweiten Teil mit snd zugreifen. Es ist jedoch vorzuziehen, eine Musterübereinstimmung zu finden

%Vor%

oder

%Vor%

Nehmen wir nun an, dass Ihre Funktion einige IO ausführt und eine String und eine Bool erhält. Ihre Funktion würde dann vage aussehen wie

%Vor%

Wenn Sie in einer Monade mit einem do -Block arbeiten und diesen verwenden, können Sie auch eine Musterübereinstimmung mit einem hübscheren Formular erstellen.

%Vor%

Beachten Sie, dass in einem do-Block sein muss . Sie können einen do-Block nur verwenden, wenn Sie einen Wert vom Typ m a zurückgeben, wobei m eine Monade ist, wie IO .

    
jozefg 30.07.2014 17:21
quelle

Tags und Links