我正在尝试编写一个非常简单的编辑器,如“ed”。 在这个程序中,我正在尝试使用映射来构建控件,该控件在要执行的操作中转换string-command。 这是一段代码:
commands :: Map String ([Handle] -> IO ())
commands = fromAscList [
("o",\list -> print "Insert name of the file to be opened" >> getLine >>= \nomefile ->
openFile nomefile ReadWriteMode >>= \handle -> editor (handle:list)),
("i",\list -> case list of { [] -> print "No buffer open" ; handle:res -> write handle } >> editor list),
("q",\list -> if list == [] then return () else mapM_ hClose list >> return ())
]
editor :: [Handle] -> IO()
editor list = do
command <- getLine
let action = lookup command commands
case action of
Nothing -> print "Unknown command" >> editor list
Just act -> act list
问题在于,当我执行编辑器功能时,无论是在ghci还是在可执行文件中,当我输入“o”时,我收到消息“Unknown command”而不是调用该函数来打开文件。我使用关联列表而不是Map尝试了相同的代码,在这种情况下它可以工作。那么这里可能出现什么问题呢?
更奇怪的是,如果我在ghci中的映射命令上调用键,它将返回包含字符串“o”的列表。
我提前感谢您的帮助。
答案 0 :(得分:6)
commands :: Map String ([Handle] -> IO ())
commands = fromAscList [
("o",_),
("i",_),
("q",_)
]
但是
ghci> Data.List.sort ["o","i","q"]
["i","o","q"]
你撒谎到Data.Map
,所以它构造了一个不满足所需不变量的Map
。因此查找Map
中的内容不起作用,因为请求是在错误的分支(有时)发送的。