haskell-jp / beginners #16 at 2021-07-08 09:41:15 +0900

Windows10, GHC8.10.4を使っています。
hSetBuffering stdin NoBufferingをしてgetCharでキーの入力を即座に読もうとしたのですが、エンターキーを押すまで入力が読み取られません
解決法はありますでしょうか
既知の問題らしいですね... :disappointed:
こちらにワークアラウンドが書いてありました。
https://hiratara.hatenadiary.jp/entry/2017/02/19/200550

また、 https://stackoverflow.com/questions/66536563/haskell-cross-platform-getchar-with-nobuffering 曰くGHC 9.0以降なら解決済みらしいので、ちょっと試してみています。
さっとこんな感じのコードを書いてGHC 9.0.1を試してみましたが、残念ながら相変わらずでした :disappointed:
import           

main :: IO ()
main = do
  hSetBuffering stdin NoBuffering
  c <- getChar
  print c
本件、問題のissueで訪ねてみたところ、RTSオプションというのを設定しないといけないようです(デフォルトで有効になっていると勘違いしてました! :man-bowing: )

なので、例えばGHC 9.0.1で :point_down: のようなオプションでコンパイルしてください:
ghc -with-rtsopts --io-manager=native file.hs

こうすることでコンパイル時に --io-manager-native というRTSオプションを有効にすることができ、getCharがバッファリングされなくなります。
RTSオプションを有効にするほかの方法は https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/runtime_control.html をご覧ください。