6

GHCi 中有没有办法基本上获得状态转储?我的意思是一个列表:

  • 所有加载的运算符及其优先级、关联性和签名。
  • 所有加载的类。
  • 所有加载的数据、类型和新类型以及它们是哪些类的实例。
  • 所有加载的函数都带有它的签名,以及它们所属的类(如果有的话)。

假设这是可能的,是否也可以在运行时执行此操作,例如在异常期间?

4

2 回答 2

4

: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 章节

于 2011-11-09T17:34:18.220 回答
1

有一些方法可以获取这些信息。问题是,据我所知,没有办法完全按照你想要的方式过滤它,但无论如何它是:

  • 如果您想查看当前在 ghci 中定义的所有标识符,包括类、运算符、构造函数和类型,只需在光标位于空白处时按 Tab。

  • 如果您想知道运算符的优先级和关联性,*只需使用

    :i *
    
  • 如果您想查看哪些类M是实例,请使用

    :i M
    
  • 如果您想查看函数的签名,f只需使用

    :i f
    

    如果您编写:set -fbreak-on-exception,那么当抛出异常时 ghci 将中断而不是失败,然后您可以在异常期间使用上述所有命令。

于 2011-11-09T17:33:58.690 回答