資料來源:赫頓,格雷厄姆。“用 Haskell 編程”(第 180 頁)
- 使用
getCh,定義一個readLine :: IO String行為方式與 getLine 相同的操作,除了它還允許使用洗掉鍵洗掉字符。
提示:洗掉字符為
’\ DEL’,游標后移一格的控制字符為’\b’。
我用一個字符解決了這個練習'\b',但在網上發現一個求解器使用了兩個。為什么這個問題的求解器使用"\b \b"而不是"\b"?似乎是一個錯字,但我不確定。我發現它適用于三個'\b'字符。
這個角色是如何作業的?
import System.IO
getCh :: IO Char
getCh = do
hSetEcho stdin False
x <- getChar
hSetEcho stdin True
return x
readLine :: IO String
readLine = readLine' ""
readLine' :: String -> IO String
readLine' xs = do
x <- getCh
case x of
'\n' -> do
putChar '\n'
return xs
'\DEL' ->
if null xs
then readLine' ""
else do
putStr "\b \b"
readLine' (init xs)
_ -> do
putChar x
readLine' (xs [x])
uj5u.com熱心網友回復:
如果你使用 just "\b",游標會向左移動,但不會洗掉那里看到的字符,直到你用新的鍵輸入覆寫它。例如,FOO←最終你會得到fo?o,但這是一種誤導:如果你沒有按下另一個字母鍵而是立即按下?,那么結果看起來仍然是foo,而實際上它只是fo。
為了避免這種情況,解決方案"\b \b"向左移動,用空格覆寫字符以可視化洗掉它,然后立即再次向左移動。這與向左移動一次并在原地洗掉角色具有相同的效果。
uj5u.com熱心網友回復:
\b將游標向后移動一個字符,但不會洗掉它(至少在大多數終端上不會)。例如,字串abcde\b將顯示為abcde,字串將顯示abcde\bf為abcdf。這就是為什么序列\b \b顯式地用空格覆寫最后一個字符,然后再次將游標移回。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/411548.html
標籤:
