私はまだ Haskell に苦労していますが、この例の Input/Output モナドに頭を悩ませる問題に遭遇しました。
main = do
line <- getLine
if null line
then return ()
else do
putStrLn $ reverseWords line
main
reverseWords :: String -> String
reverseWords = unwords . map reverse . words
Haskell のような関数型言語は関数の副作用に基づくことができないため、何らかの解決策を考案する必要があったことは理解しています。この場合、すべてをdo
ブロックにラップする必要があるようです。簡単な例が得られますが、この場合、誰かの説明が本当に必要です:
- I/O アクションに単一の
do
ブロックを使用するだけでは十分でないのはなぜですか? - if/else ケースで完全に新しいものを開く必要があるのはなぜですか?
- また、モナドの「スコープ」が
do
終了するのはいつですか?つまり、標準のHaskell用語/関数を使用できるのはいつですか?