Если вы не хотите блокировать, вы можете использовать hReady
, чтобы определить, была ли нажата клавиша.Это полезно для игр, в которых вы хотите, чтобы программа запускалась и поднимала нажатие клавиши всякий раз, когда это происходило без остановки игры.
Вот удобная функция, которую я использую для этого:
ifReadyDo :: Handle -> IO a -> IO (Maybe a)
ifReadyDo hnd x = hReady hnd >>= f
where f True = x >>= return . Just
f _ = return Nothing
Что можно использовать следующим образом:
stdin `ifReadyDo` getChar
Возвращает Maybe
, то есть Just
, если была нажата клавиша, и Nothing
в противном случае.