Haskell 当使用Data.Map时,如何知道哪些元素不在映射中。!

Haskell 当使用Data.Map时,如何知道哪些元素不在映射中。!,haskell,Haskell,我有一个Haskell程序,它使用Data.Map在几个地方。执行程序后,出现错误消息,说明元素不在映射中。 我想知道我怎么知道在程序的哪一行使用了Data.Map以及在地图中找不到的元素?该(!)操作符不用于查找可能不在地图中的内容。虽然您可以在IOmonad中捕获结果错误,但这将是非常糟糕的风格 相反,使用lookup,它返回可能是一个,特别是当元素不在映射中时,返回Nothing 编辑:好吧,我误解了你的问题。保留原始答案以防有用,但假设(!)确实是您想要的,并且您正在调试,您可以做以下几

我有一个Haskell程序,它使用
Data.Map在几个地方。执行程序后,出现错误消息,说明
元素不在映射中
。 我想知道我怎么知道在程序的哪一行使用了
Data.Map以及在地图中找不到的元素?

(!)
操作符不用于查找可能不在地图中的内容。虽然您可以在
IO
monad中捕获结果错误,但这将是非常糟糕的风格

相反,使用
lookup
,它返回
可能是一个
,特别是当元素不在映射中时,返回
Nothing

编辑:好吧,我误解了你的问题。保留原始答案以防有用,但假设
(!)
确实是您想要的,并且您正在调试,您可以做以下几件事:

  • 您可以在导入中临时隐藏
    (!)
    ,而是定义您自己的版本,该版本使用
    查找
    ,并抛出一个更有用的错误(可能包含您试图查找的密钥,如果它有Show实例)

  • 您可以在GHCi调试器中运行代码,并使用-fbreak on exception在发生查找的位置停止代码

  • 您可以使用
    Debug.Trace
    模块向代码中添加跟踪语句


  • 不要使用
    (!)
    。改为使用
    查找
    。此外,有关如何不明智地使用分部函数调试错误的上一个问题,请参见此处:太糟糕了,没有
    (!)
    的安全变体。