GHCi语法显示类型类函数的特化

Jog*_*ger 3 syntax haskell ghci

在命令之后,:set -XTypeApplications我们可以使用GHCi来显示特定实例的类型类函数的特化.

一个简单的例子:

:type fmap @Maybe
Run Code Online (Sandbox Code Playgroud)

GHCi回复

fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b
Run Code Online (Sandbox Code Playgroud)

问题:具有两个(或更多)多态参数的数据类型的实例的语法如何?

函子类,这些都像实例Either a,((,) a((->) r).我尝试了以下示例,但所有这些示例都被GHCi拒绝:

:t fmap @Either 
:t fmap @(Either a)
:t fmap @(Either a b)
:t forall a. fmap @(Either a)
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 6

它应该是

> :t fmap @(Either a)
Run Code Online (Sandbox Code Playgroud)

但这需要a在范围内,而不是.为此,我们需要类型级抽象

> -- pseudo code
> :t \ (a :: *) -> fmap @(Either a)
forall a b c . (b -> c) -> Either a b -> Either a c 
Run Code Online (Sandbox Code Playgroud)

但这只在Core中找到.

但是,我们可以使用自定义的虚拟类型A:

> data A -- don't declare instances for this
> :t fmap @(Either A)
forall b c. (b -> c) -> Either A b -> Either A c 
Run Code Online (Sandbox Code Playgroud)

更简单的替代方案,使用部分类型注释.

> :t fmap @(Either _)
fmap @(Either _) :: (a -> b) -> Either t a -> Either t b
Run Code Online (Sandbox Code Playgroud)