在 Haskell 中开发时查看未公开的库函数

View non-exposed library functions while developing in Haskell

我犯了一个错误 可以通过查看

来解决
:t myfunctionofinterest

我在库中使用的函数。

但是,当我在我的项目根目录中时,运行

$ stack ghci

我的 Main.hs 有:

import MyLib

而我的模块是:

module MyLib {
  bunchOfFunctions -- but not myfunctionofinterest
} where

import SomeDB.ModuleThatExposes -- myfunctionofinterest

myfunc :: IO ()
myfunc = do
  myfunctionofinterest a b c -- place where I misuse myfunctionofinterest and could have used :t on it to see it had 3 args

我不能 :t myfunctionofinterest 在 main 中,因为它没有公开,Import MyLib.myfunctionofinterest 也没有明确公开 帮助,因为它是在导入中定义的。虽然我知道我可以公开它然后检查它,:a 进行编译,然后编辑 lib 以再次隐藏它,但有什么可以更快更直接地做到这一点吗?

这似乎是一个常见的模式。当您在开发过程中需要检查库中使用的东西的类型时,您会怎么做?

引用 GHCi docs:

The :module command provides a way to do two things that cannot be done with ordinary import declarations:

  • :module supports the * modifier on modules, which opens the full top-level scope of a module, rather than just its exports.

额外的 * 使 GHCi 加载模块的字节码版本。这不会那么高效,但您将可以访问未导出的绑定。

示例:

λ> :m *MyLib
λ> :t myfunctionofinterest

如果你得到

module 'MyLib' is not interpreted; try ':add *MyLib' first

你可能必须先做 :load(关于 :add 的建议并不总能奏效):

λ> :l *MyLib
λ> :m *MyLib
λ> :t myfunctionofinterest