Debugging 如何在Haskell应用程序中高效地探索第三方库?

Debugging 如何在Haskell应用程序中高效地探索第三方库?,debugging,haskell,ghci,developer-tools,code-inspection,Debugging,Haskell,Ghci,Developer Tools,Code Inspection,在与哈斯克尔断断续续相处了大约两年后,我基本上还是个初学者。想想看,最让我慢下来的是,由于使用生产系统所需的各种库,很难理解数据结构和monad堆栈。我经常发现自己处于这样一种情况:我希望在某个地方设置一个断点,然后在该点上检查绑定和嵌套数据结构。使用其他语言的复杂框架,这通常比研究其源代码和(通常不充分的)文档更能深入了解数据和运行时行为。在哈斯克尔类似的“探索”路线是什么 是的,这是一个相当必要的想法,代码几乎等于控制流,其中绑定是具有可变状态的变量。然而,我认为,Haskell程序与其他库

在与哈斯克尔断断续续相处了大约两年后,我基本上还是个初学者。想想看,最让我慢下来的是,由于使用生产系统所需的各种库,很难理解数据结构和monad堆栈。我经常发现自己处于这样一种情况:我希望在某个地方设置一个断点,然后在该点上检查绑定和嵌套数据结构。使用其他语言的复杂框架,这通常比研究其源代码和(通常不充分的)文档更能深入了解数据和运行时行为。在哈斯克尔类似的“探索”路线是什么

是的,这是一个相当必要的想法,代码几乎等于控制流,其中绑定是具有可变状态的变量。然而,我认为,Haskell程序与其他库中的复杂monad堆栈没有太大区别

例如:我正在尝试构建一个包含会话的服务应用程序。在服务客户端中,会话信息肯定必须在堆栈中的某个位置进行维护。是Servant Auth还是较低级别(Warp?)我想知道确切的位置,并找出如何访问会话信息。我想编写一个测试,执行登录,执行一些请求,然后再次注销

在Python、Java等语言中,我会在内存中的数据结构中进行登录、中断和浏览,以找出信息所在的位置;然后与文档进行比较,以了解如何最好地使用它。在Haskell中,我觉得自己被困在图书馆源代码中,无法将类型签名的各个层拼凑在一起,甚至无法构建最小的示例程序来理解正在发生的事情。这肯定比简单地检查记忆中已经存在的东西慢十到五十倍,但我不能轻易地去探索


因此,我认为“探索式”风格有助于理解复杂的库和框架,并快速提高工作效率。因此,我正在寻找如何最好地探索Haskell代码的建议。有没有一种方法可以使用ghci来实现这一点,即使是使用复杂的应用程序堆栈?调试器?任何其他建议,比在我的代码中散布
trace
语句提供更多的洞察力吗?

具体地说,在这种情况下:查看应用程序的monad堆栈应该给您一些如何完成的提示。总的来说,我发现源代码通常是检查应用程序的最好和最简单的方法(但我对Java没有太多经验,因为Java具有出色的调试器支持)。通常,我发现一个好的IDE加上goto定义支持就足够了。虽然我可以肯定地看到你想要什么的理由,但他们主要关心的是低级别的优化。对于学习/探索来说,您在给定应用程序中拥有什么具体价值以及它们在哪里并不真正有趣——这些都是特定用例的细节。更有趣的是可能存在哪些值,因此您不需要太多地查看源代码、文档,当然也不需要查看运行时发生的任何事情,而是查看类型(Haskell的ADT比OO类层次结构更清晰,IMO)…但是,是的,对于您正在询问的用例,这肯定是一个有点不同的故事——它只是一个非常重要的领域,并不真正代表典型的Haskell项目。当然。我想很多人会说Haskell不是适合这种应用程序的语言。其他人可能会说,它应该以一种完全不同于OO语言的风格来完成,更倾向于FRP。但当然也有Haskeller用他们的monad trafo堆栈务实地处理它,他们可能已经找到了方法来满足您的要求。GHCi中有一个调试器,它可能不完全是您所习惯的,但也没有那么奇怪。你能帮我澄清一下你的问题所在吗:知道GHCi调试器存在,在GHCi中加载应用程序代码,或者使用调试器在非严格上下文中探索事物?