Свалка среды GHCi - PullRequest
       6

Свалка среды GHCi

6 голосов
/ 09 ноября 2011

Есть ли в GHCi способ получить дамп состояния?Под этим я подразумеваю список:

  • Все загруженные операторы, а также их приоритет, ассоциативность и подпись.
  • Все загруженные классы.
  • Все загруженные данные, тип и новый тип, а также классы, к которым они относятся.
  • Все загруженные функции с их сигнатурой и класс, к которому они относятся, если они это делают.

Предполагая, что это возможно, возможно ли это сделать во время выполнения, скажем, во время исключения?

Ответы [ 2 ]

4 голосов
/ 09 ноября 2011

: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 или см. главу GHCi в руководстве пользователя GHC .

1 голос
/ 09 ноября 2011

Есть способы получить эту информацию. Проблема в том, что, насколько я знаю, нет способа отфильтровать его так, как вы хотите, но в любом случае вот оно:

  • Если вы хотите увидеть все идентификаторы, включая классы, операторы, конструкторы и типы, которые в настоящее время определены в ghci, просто нажмите tab, когда у вас есть курсор на пробел.

  • Если вы хотите знать приоритет и ассоциативность оператора *, просто используйте

    :i *
    
  • Если вы хотите увидеть, какие классы M являются экземплярами, просто используйте

    :i M
    
  • Если вы хотите увидеть подпись функции f, просто используйте

    :i f
    

    Если вы напишите :set -fbreak-on-exception, то ghci скорее сломается, чем завершится сбоем при возникновении исключения, и тогда вы сможете использовать все вышеперечисленные команды во время исключения.

...