我想更改I / O操作输入中显示的字符键。
例如,假设密钥'b'
已交换为'a'
,
那我想要这个结果:
如果我输入密钥 b ,我会得到 a
Prelude> getChar
a -- I actually typed the key b
'a'
谢谢!
答案 0 :(得分:3)
您无法修改getChar
。但是,您可以这样做:
Prelude> let swap :: Char -> Char; swap 'b' = 'a'; swap c = c
Prelude> fmap swap getChar
b'a'
如果您要删除字符b
并将其替换为字符a
,则可以执行以下操作:
Prelude> :{
Prelude| let getChar' :: IO Char;
Prelude| getChar' = do
Prelude| c <- getChar
Prelude| if c == 'b'
Prelude| then do
Prelude| putChar '\b' -- delete the previous character
Prelude| putChar 'a' -- write a new character
Prelude| return 'a'
Prelude| else return c
Prelude| :}
Prelude> getChar'
a'a' -- I typed in `a'
Prelude> getChar'
a'a' -- I typed in `b'
Prelude> getChar'
c'c' -- I typed in `c'
更简洁:
Prelude> let replace c = putChar '\b' >> putChar c >> return c
Prelude> let swap 'b' = replace 'a'; swap c = return c
Prelude> getChar >>= swap
a'a' -- I typed in `a'
Prelude> getChar >>= swap
a'a' -- I typed in `b'
Prelude> getChar >>= swap
c'c' -- I typed in `c'
希望有所帮助。