Zasadniczo fmap print (print "Hello World")stosuje swój pierwszy parametr, printfunkcję, do wyniku print "Hello World". Jest to po prostu odpowiednik wywoływania print ()po wykonaniu print "Hello World"akcji.
Redu
@Redu To prawda, ale pamiętaj, że wywołanie print ()nigdy nie jest oceniane, ani wykonywane jest jego działanie (które wypisuje się ()na standardowe wyjście). Tak więc „wywoływanie print ()po ...” jest nieco mylące (IMO).
chi
Odpowiedzi:
21
main :: IO (IO ())
main = print <$>(print "Hello, World!")
jest równoznaczny, dzięki prawom monady, z
main :: IO (IO ())
main =do
result <- print "Hello, World!"
return (print result)
Teraz printzawsze zwraca ()wynik, więc cały kod jest równoważny
main :: IO (IO ())
main =do_<- print "Hello, World!"
return (print ())
Ostatecznie wynik mainjest po prostu odrzucany. Oznacza to, że ostatnia linia może być return (putStrLn "this is ignored")i mieć ten sam efekt.
Dlatego kod wykona tylko pierwszy print "Hello, World!".
Polecam, abyś zawsze określał main :: IO (). Haskell pozwala nam deklarować main :: IO AnyTypeHere, ale jest to (IMO) mylące.
Poleciłbym również, abyś używał putStrLn, a nie printdrukował napisów, ponieważ ten ostatni zacytuje i ucieknie cały napis.
fmap print (print "Hello World")
stosuje swój pierwszy parametr,print
funkcję, do wynikuprint "Hello World"
. Jest to po prostu odpowiednik wywoływaniaprint ()
po wykonaniuprint "Hello World"
akcji.print ()
nigdy nie jest oceniane, ani wykonywane jest jego działanie (które wypisuje się()
na standardowe wyjście). Tak więc „wywoływanieprint ()
po ...” jest nieco mylące (IMO).Odpowiedzi:
jest równoznaczny, dzięki prawom monady, z
Teraz
print
zawsze zwraca()
wynik, więc cały kod jest równoważnyOstatecznie wynik
main
jest po prostu odrzucany. Oznacza to, że ostatnia linia może byćreturn (putStrLn "this is ignored")
i mieć ten sam efekt.Dlatego kod wykona tylko pierwszy
print "Hello, World!"
.Polecam, abyś zawsze określał
main :: IO ()
. Haskell pozwala nam deklarowaćmain :: IO AnyTypeHere
, ale jest to (IMO) mylące.Poleciłbym również, abyś używał
putStrLn
, a nieprint
drukował napisów, ponieważ ten ostatni zacytuje i ucieknie cały napis.źródło
f <$> a ≡ a >>= \r -> return $ f r
nie jest to tylko konkretna sytuacja w tej sytuacji, ale w rzeczywistości dotyczy każdej monady.