계산할 때 IO (IO ())
모두 (IO ())
와 ()
계산하므로 이유
main :: IO (IO ())
main = print <$> (print "Hello, World!")
인쇄
"Hello, World!"
아니
IO "Hello, World!" -- ??
"Hello, World!"
답변
main :: IO (IO ())
main = print <$> (print "Hello, World!")
모나드 법칙 덕분에
main :: IO (IO ())
main = do
result <- print "Hello, World!"
return (print result)
이제 print
항상 ()
결과로 반환 되므로 전체 코드는
main :: IO (IO ())
main = do
_ <- print "Hello, World!"
return (print ())
마지막으로 결과 main
는 단순히 폐기됩니다. 즉, 마지막 줄은 return (putStrLn "this is ignored")
효과가 동일 할 수 있습니다 .
따라서 코드는 첫 번째 코드 만 실행합니다 print "Hello, World!"
.
항상 정의하는 것이 좋습니다 main :: IO ()
. Haskell은 우리가 선언 할 수있게 main :: IO AnyTypeHere
하지만 이것은 (IMO) 혼동됩니다.
후자는 전체 문자열을 인용하고 이스케이프하므로 문자열을 인쇄 putStrLn
하지 print
말고을 사용하는 것이 좋습니다 .