haskell-jp / beginners #19 at 2022-01-10 01:18:04 +0900

Stack を使って初めてプログラムをビルド、実行したのですが、ターミナルの表示がうまくいきません。具体的には、『Programming in Haskell』にあった計算機のプログラム(を少し変えたもの)を使いました。このプログラムはうまくいけば電卓のインターフェースがターミナルに表示されてREPLのように振る舞うのですが、画像のようにパスワードを入力するようなモードになってしまい、プログラムの出力も、こちらからの入力も見えない状態になってしまいました。control + c で終了するとその間の入力および出力が保存されていることはわかります。原因をご存知の方がいれば教えていただけないでしょうか。
とりあえず差し支えなければソースコード全体を見せていただけませんか?
ありがとうございます。stack new でプロジェクトを作成した後、src/Lib.hs と app/Main.hs のみを変更しましたので、その2つのソースコードを以下に添付します。
実行してみたところ標準入出力がバッファリングされてしまっているようですね。なんで本で触れないんだろう...
恐らく次のように run 関数などの先頭でバッファリングを切れば直ります:
run :: IO ()
run = do hSetBuffering stdout NoBuffering
         hSetBuffering stdin NoBuffering
         cls
         showbox
         standby []
※「恐らく」と言ったのは手元ですぐに使える環境がWindowsなので、 https://gitlab.haskell.org/ghc/ghc/-/issues/2189 のバグにハマって完全な確認はできなかったため
ありがとうございます。バッファリングを切ったら期待通り動いてくれました!あと、確かにhSetBufferingについては『Programming in Haskell』の電卓を実装する章では触れられていなかったのですが、それより前の「10章対話プログラム」で(さらっとですが)触れられていました。入出力に関する不具合というところからバッファリングに問題があるかもしれないと気づけていればこの本の該当箇所のことを思い出せたかもしれません。こういうトラブルシューティングの際の目の付け所は経験あるのみなのでしょうかね。。。とにかく助かりました、ありがとうございました:relieved: