Haskell で遅延 IO を把握するための旅で、次のことを試しました。
main = do
chars <- getContents
consume chars
consume :: [Char] -> IO ()
consume [] = return ()
consume ('x':_) = consume []
consume (c : rest) = do
putChar c
consume rest
「x」を押すまで、標準入力に入力されたすべての文字をエコーするだけです。
したがって、次の行に沿って何かを行うことgetContents
を使用して再実装できるはずだと素朴に考えました。getChar
myGetContents :: IO [Char]
myGetContents = do
c <- getChar
-- And now?
return (c: ???)
IO モナドの概念全体を壊してしまう???
タイプの関数が必要になるため、それほど単純ではないことがわかりました。IO [Char] -> [Char]
getContents
(というよりは)の実装をチェックするとhGetContents
、汚い IO のソーセージ ファクトリ全体が明らかになります。myGetContents
ダーティなコード、つまりモナドを壊すコードを使わないと実装できない私の仮定は正しい ですか?