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.