Haskell IO (String) und String

7

Ich möchte Funktionen schreiben und das Ergebnis in eine Zeichenfolge schreiben.

Ich möchte Funktion:

%Vor%

Ich benutze:

%Vor%

Ich mache:

%Vor%

Ich möchte str fragen ist String oder nicht?

Wir wissen das:

%Vor%

Dann warum kann ich nicht:

%Vor%

Ich bekomme den Fehler:

%Vor%

Danke.

    
0xAX 08.07.2011, 18:25
quelle

4 Antworten

6

Ich denke, niemand hat diese sehr wichtige Frage schon beantwortet:

  

Ich möchte str fragen ist String oder nicht?

Ich werde es versuchen.

Der Typ der Variable str ist String , yes. Der Umfang dieser Variablen ist jedoch sehr begrenzt. Ich denke, Entschuldigung der do-Notation ist notwendig für das Verständnis:

%Vor%

Ich denke hier wird es klarer, warum str nicht gut genug ist. Es ist ein Argument der Funktion, die Sie an >>= übergeben. Sein Wert wird nur verfügbar, wenn jemand Ihre Funktion aufruft, was nur geschieht, wenn die IO -Aktion, die ihn enthält, ausgeführt wird.

Auch der Typ von read' :: IO () wird nicht so sehr von putStrLn str , sondern vom Rückgabetyp des Operators >>= bestimmt. Schau es dir an (spezialisiert auf die IO monad):

%Vor%

Sie können sehen, dass das Ergebnis immer eine Aktion IO b ist, daher hilft es auch nicht, Argumente zu ändern.

Sie können einige Monad Tutorials lesen, wenn Sie verstehen möchten, warum der Typ so ist wie er ist. Die Intuition dahinter ist: Sie können keine Aktion ausführen, ohne eine Aktion auszuführen.

Und auf der praktischen Seite der Frage, um den von einer Aktion zurückgegebenen Wert zu verwenden, anstatt use (extractValue inputAction) zu versuchen, was nicht Sinn macht, weil extractValue nicht möglich ist, versuchen Sie inputAction >>= use , wenn Ihre use betrifft I / O, oder fmap use inputAction , wenn dies nicht der Fall ist.

    
Rotsor 08.07.2011, 21:12
quelle
10

Nur um ein bisschen mehr zu streiten, während die anderen Antworten vollkommen korrekt sind, möchte ich etwas betonen: Etwas mit dem Typ IO String ist nicht nur eine Zeichenkette, auf die das Typsystem nicht direkt zugreifen kann. Es ist eine Berechnung, die I / O ausführt, um eine Zeichenfolge für Sie zu erhalten . Das Anwenden von readFile auf einen Dateipfad ergibt keinen String -Wert mehr als das Steak neben einem Fleischwolf zu einem Hamburger zu verwandeln.

Wenn Sie einen Code wie diesen haben:

%Vor%

Das heißt nicht, dass du " getStr zweimal aus der Zeichenfolge entfernst". Es bedeutet, dass Sie die Berechnung zweimal durchführen und leicht unterschiedliche Ergebnisse zwischen den beiden erhalten können.

    
C. A. McCann 08.07.2011 18:56
quelle
4

Sie sollten return str in read' verwenden, wenn Sie möchten, dass str anstelle von () zurückgegeben wird. Sie können IO nicht vom Typ read' entfernen, da dies keine reine Funktion ist. Um besser zu verstehen, wie Input / Output in Haskell funktioniert, empfehle ich Ihnen, ein Tutorial zu lesen .

    
Mikhail Glushenkov 08.07.2011 18:28
quelle
1
___ qstnhdr ___ Haskell IO (String) und String ___ qstntxt ___

Ich möchte Funktionen schreiben und das Ergebnis in eine Zeichenfolge schreiben.

Ich möchte Funktion:

%Vor%

Ich benutze:

%Vor%

Ich mache:

%Vor%

Ich möchte str fragen ist String oder nicht?

Wir wissen das:

%Vor%

Dann warum kann ich nicht:

%Vor%

Ich bekomme den Fehler:

%Vor%

Danke.

    
___ answer6629119 ___

Nur um ein bisschen mehr zu streiten, während die anderen Antworten vollkommen korrekt sind, möchte ich etwas betonen: Etwas mit dem Typ unsafePerformIO ist nicht nur eine Zeichenkette, auf die das Typsystem nicht direkt zugreifen kann. Es ist eine Berechnung, die I / O ausführt, um eine Zeichenfolge für Sie zu erhalten . Das Anwenden von %code% auf einen Dateipfad ergibt keinen %code% -Wert mehr als das Steak neben einem Fleischwolf zu einem Hamburger zu verwandeln.

Wenn Sie einen Code wie diesen haben:

%Vor%

Das heißt nicht, dass du " %code% zweimal aus der Zeichenfolge entfernst". Es bedeutet, dass Sie die Berechnung zweimal durchführen und leicht unterschiedliche Ergebnisse zwischen den beiden erhalten können.

    
___ tag123input ___ Die Eingabe bezieht sich normalerweise auf die Benutzereingabe, d. h. auf die Daten, die der Benutzer an eine laufende Anwendung liefert. In vielen Systemen wird diese Eingabe als potenziell gefährlich angesehen und muss bereinigt werden, um sicherzustellen, dass der Benutzer keinen ausführbaren Code in die Anwendung injiziert hat. ___ tag123haskell ___ Haskell ist eine funktionale Programmiersprache mit starker statischer Typisierung, verzögerungsfreier Auswertung, umfangreicher Parallelitäts- und Parallelitätsunterstützung und einzigartigen Abstraktionsfunktionen. ___ tag123io ___ Bei der Berechnung bezieht sich die Eingabe / Ausgabe oder E / A auf die Kommunikation zwischen einem Informationsverarbeitungssystem (z. B. einem Computer) und der Außenwelt, möglicherweise einem Menschen, oder einem anderen Informationsverarbeitungssystem. ___ antwort6628803 ___

Als einen ausführlicheren Grund warum: Es erlaubt Unreinheit.

Sie können während einer reinen Operation absolut keine IO ausführen oder die referenzielle Transparenz vollständig durchbrechen. Technisch können Sie %code% verwenden, aber es würde in diesem Fall referentielle Transparenz brechen - Sie sollten das nur verwenden, wenn Sie garantieren können, dass das Ergebnis immer gleich ist.

    
___ answer6628781 ___

Sie sollten %code% in %code% verwenden, wenn Sie möchten, dass %code% anstelle von %code% zurückgegeben wird. Sie können %code% nicht vom Typ %code% entfernen, da dies keine reine Funktion ist. Um besser zu verstehen, wie Input / Output in Haskell funktioniert, empfehle ich Ihnen, ein Tutorial zu lesen .

    
___ answer6630571 ___

Ich denke, niemand hat diese sehr wichtige Frage schon beantwortet:

  

Ich möchte str fragen ist String oder nicht?

Ich werde es versuchen.

Der Typ der Variable %code% ist %code% , yes. Der Umfang dieser Variablen ist jedoch sehr begrenzt. Ich denke, Entschuldigung der do-Notation ist notwendig für das Verständnis:

%Vor%

Ich denke hier wird es klarer, warum %code% nicht gut genug ist. Es ist ein Argument der Funktion, die Sie an %code% übergeben. Sein Wert wird nur verfügbar, wenn jemand Ihre Funktion aufruft, was nur geschieht, wenn die %code% -Aktion, die ihn enthält, ausgeführt wird.

Auch der Typ von %code% wird nicht so sehr von %code% , sondern vom Rückgabetyp des Operators %code% bestimmt. Schau es dir an (spezialisiert auf die %code% monad):

%Vor%

Sie können sehen, dass das Ergebnis immer eine Aktion %code% ist, daher hilft es auch nicht, Argumente zu ändern.

Sie können einige Monad Tutorials lesen, wenn Sie verstehen möchten, warum der Typ so ist wie er ist. Die Intuition dahinter ist: Sie können keine Aktion ausführen, ohne eine Aktion auszuführen.

Und auf der praktischen Seite der Frage, um den von einer Aktion zurückgegebenen Wert zu verwenden, anstatt %code% zu versuchen, was nicht Sinn macht, weil %code% nicht möglich ist, versuchen Sie %code% , wenn Ihre %code% betrifft I / O, oder %code% , wenn dies nicht der Fall ist.

    
___
alternative 08.07.2011 18:30
quelle

Tags und Links