GHCi 中有没有办法基本上获得状态转储?我的意思是一个列表:
- 所有加载的运算符及其优先级、关联性和签名。
- 所有加载的类。
- 所有加载的数据、类型和新类型以及它们是哪些类的实例。
- 所有加载的函数都带有它的签名,以及它们所属的类(如果有的话)。
假设这是可能的,是否也可以在运行时执行此操作,例如在异常期间?
:browse
将为您提供大部分信息。表明
没有任何参数,它显示当前加载的模块的信息。您还可以指定不同的模块。
Prelude> :browse Control.Applicative
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
(*>) :: f a -> f b -> f b
(<*) :: f a -> f b -> f a
...
要查看更多详细信息,包括运算符的优先级和关联性,以及数据类型的实例,请使用:info
.
Prelude> :info (^)
(^) :: (Num a, Integral b) => a -> b -> a -- Defined in GHC.Real
infixr 8 ^
Prelude> :info Bool
data Bool = False | True -- Defined in GHC.Bool
instance Bounded Bool -- Defined in GHC.Enum
instance Enum Bool -- Defined in GHC.Enum
instance Eq Bool -- Defined in GHC.Base
instance Ord Bool -- Defined in GHC.Base
instance Read Bool -- Defined in GHC.Read
这些命令在调试时也可用。
有关详细信息,请键入:help
或参阅GHC 用户指南的 GHCi 章节。
有一些方法可以获取这些信息。问题是,据我所知,没有办法完全按照你想要的方式过滤它,但无论如何它是:
如果您想查看当前在 ghci 中定义的所有标识符,包括类、运算符、构造函数和类型,只需在光标位于空白处时按 Tab。
如果您想知道运算符的优先级和关联性,*
只需使用
:i *
如果您想查看哪些类M
是实例,请使用
:i M
如果您想查看函数的签名,f
只需使用
:i f
如果您编写:set -fbreak-on-exception
,那么当抛出异常时 ghci 将中断而不是失败,然后您可以在异常期间使用上述所有命令。