haskell-jp / mokumoku-online #36 at 2021-06-12 14:47:13 +0900

@igrep すみません、ちょっと質問よろしいでしょうか
main = do
  input <- getContents
  putStrLn input

上記のようなコードを実行すると、`input` を入力して出力するという動作が無限ループのように何度も何度も行われてしまうので、毎回`ctrl + c(z)` を押してプログラムを終了しなければいけません。これはHaskellの仕様ですか?一回だけ実行して終わってほしいのですが...
それは Haskell の仕様というより、getContents の仕組みだと思います。getContent は EOF もらうまで入力を受け付けるので、無限ループしてるみたいに感じるのだと。実際には、この2行をグルグルしてるのではなく、受け取った input を逐次 putStrLn で出力してるだけですかね。
Ctrl+CじゃなくてCtrl+Dを押せば普通に終了できます!
一行ずつでいいなら getLine を使うか .Strict.getContents を使えば、期待する振る舞いになるかと
詳しくは「遅延IO」で検索してみてください。結構取り扱いが難しいので、 getContents はあまり使わない方がいいでしょう。数GBもあるファイルを読むのでなければ、 仰るとおり .Strict.getContents で十分でしょうし、本当に大容量のファイルを少しずつ読みたいのであればconduitなどのストリーミング用ライブラリーを使った方が確実ですし。
ありがとうございます!`.Strict.getContents` で期待通りになりました。遅延IOについてちょっと調べてみます!!
いまだに遅延 IO 分からない……(分からなくても困らない