Grundsätzlich fmap print (print "Hello World")wird der erste Parameter, die printFunktion, auf das Ergebnis von angewendet print "Hello World". Dies entspricht einfach dem Aufrufen print ()nach dem print "Hello World"Ausführen einer Aktion.
Redu
@Redu Das ist richtig, aber beachten Sie, dass der Aufruf von print ()nie ausgewertet oder seine Aktion ausgeführt wird (was ()auf stdout gedruckt würde ). "Aufrufen print ()nach ..." ist also etwas irreführend (IMO).
Chi
Antworten:
21
main :: IO (IO ())
main = print <$>(print "Hello, World!")
ist dank der Monadengesetze gleichbedeutend mit
main :: IO (IO ())
main =do
result <- print "Hello, World!"
return (print result)
Gibt jetzt printimmer ()als Ergebnis zurück, sodass der gesamte Code äquivalent zu ist
main :: IO (IO ())
main =do_<- print "Hello, World!"
return (print ())
Schließlich wird das Ergebnis von maineinfach verworfen. Das heißt, die letzte Zeile könnte return (putStrLn "this is ignored")den gleichen Effekt haben und haben.
Daher führt der Code nur den ersten aus print "Hello, World!".
Ich würde empfehlen, dass Sie immer definieren main :: IO (). Haskell erlaubt uns zu deklarieren main :: IO AnyTypeHere, aber das ist (IMO) verwirrend.
Ich würde Ihnen auch empfehlen putStrLn, printZeichenfolgen zu verwenden und nicht zu drucken, da letztere die gesamte Zeichenfolge zitieren und maskieren.
Ich würde hinzufügen, dass dies f <$> a ≡ a >>= \r -> return $ f rnicht nur eine spezifische Sache in dieser Situation ist, sondern tatsächlich für jede Monade gilt.
fmap print (print "Hello World")
wird der erste Parameter, dieprint
Funktion, auf das Ergebnis von angewendetprint "Hello World"
. Dies entspricht einfach dem Aufrufenprint ()
nach demprint "Hello World"
Ausführen einer Aktion.print ()
nie ausgewertet oder seine Aktion ausgeführt wird (was()
auf stdout gedruckt würde ). "Aufrufenprint ()
nach ..." ist also etwas irreführend (IMO).Antworten:
ist dank der Monadengesetze gleichbedeutend mit
Gibt jetzt
print
immer()
als Ergebnis zurück, sodass der gesamte Code äquivalent zu istSchließlich wird das Ergebnis von
main
einfach verworfen. Das heißt, die letzte Zeile könntereturn (putStrLn "this is ignored")
den gleichen Effekt haben und haben.Daher führt der Code nur den ersten aus
print "Hello, World!"
.Ich würde empfehlen, dass Sie immer definieren
main :: IO ()
. Haskell erlaubt uns zu deklarierenmain :: IO AnyTypeHere
, aber das ist (IMO) verwirrend.Ich würde Ihnen auch empfehlen
putStrLn
,print
Zeichenfolgen zu verwenden und nicht zu drucken, da letztere die gesamte Zeichenfolge zitieren und maskieren.quelle
f <$> a ≡ a >>= \r -> return $ f r
nicht nur eine spezifische Sache in dieser Situation ist, sondern tatsächlich für jede Monade gilt.