如何在haskell中交换键盘字符

时间:2015-09-05 12:57:55

标签: haskell io keyboard

我想更改I / O操作输入中显示的字符键。 例如,假设密钥'b'已交换为'a',   那我想要这个结果:   如果我输入密钥 b ,我会得到 a

Prelude> getChar
a   -- I actually typed the key b
'a' 

谢谢!

1 个答案:

答案 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'

希望有所帮助。