Может ли GHCi выполнять подстановки в командах `: type <expr>`?

GHCi имеет :type <expr> чтобы показать тип выражения:

Prelude> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

Может ли GHCi показать результат после подстановки любой из переменных типа? Например, пусть f = ((->) c), затем

:t (<*>) ::  ((->) c) (a->b) -> ((->) c) a -> ((->) c) b
(<*>) ::  ((->) c) (a->b) -> ((->) c) a -> ((->) c) b
  :: (c -> a -> b) -> (c -> a) -> c -> b

Есть ли способ позволить GHCi отработать эти замены?

1 ответ

Решение

Да, есть несколько способов. Многие операции делают свои переменные типа частью своего API, и вы можете наблюдать это, включив правильные опции и задавая правильный путь.

> :set -fprint-explicit-foralls 
> :t +v (<*>)
(<*>)
  :: forall (f :: * -> *).
     Applicative f =>
     forall a b. f (a -> b) -> f a -> f b

Это на самом деле не выглядит особенным, но говорит о чем-то важном: потому что forallПеременные типа d не заключены в фигурные скобки, они могут быть объектом приложений типа. (Но вы должны доверять разнице "фигурные скобки"/"не фигурные скобки" только в :t +v запросы! Нормальный :t изменяет доступность типа приложения хрупким способом, который может измениться с версии GHC на версию GHC.)

> :set -XTypeApplications
> :t (<*>) @((->) _)
(<*>) @((->) _)
  :: forall {w} {a} {b}. (w -> a -> b) -> (w -> a) -> w -> b

Иногда вы найдете термин, где вы не можете использовать приложения типа таким образом. Например:

> :t +v \f x -> f <*> x
\f x -> f <*> x
  :: forall {f :: * -> *} {a} {b}.
     Applicative f =>
     f (a -> b) -> f a -> f b

Здесь фигурные скобки указывают на то, что для применения типов нет доступных типов. Нам не повезло? Нет, мы все еще можем использовать типовые отверстия, чтобы заполнить только те части, которые нам интересны, и спросить GHC об остальных.

> :set -XPartialTypeSignatures
> :set -Wno-partial-type-signatures
> :t (\f x -> f <*> x) :: ((_ -> _) -> _)
(\f x -> f <*> x) :: ((_ -> _) -> _)
  :: forall {w} {a} {b}. (w -> a -> b) -> (w -> a) -> w -> b
Другие вопросы по тегам