回答:
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
。
f <$> a ≡ a >>= \r -> return $ f r
これはこの状況に特定のことだけではなく、実際にはどのモナドにも当てはまります。
fmap print (print "Hello World")
は、最初のパラメータであるprint
関数をの結果に適用しprint "Hello World"
ます。これは単に、アクションが実行されたprint ()
後に呼び出すことと同じですprint "Hello World"
。