GHCi 语法,用于显示类型类函数的专用化



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

一个简单的例子:

:type fmap @Maybe

GHCi 回复

fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b

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

函子类中,这些是像 Either a((,) a((->) r) 这样的实例。我尝试了以下示例,但都被GHCi拒绝了:

:t fmap @Either 
:t fmap @(Either a)
:t fmap @(Either a b)
:t forall a. fmap @(Either a)

它应该是

> :t fmap @(Either a)

但这需要a在范围内,而事实并非如此。为此,我们需要类型级抽象

> -- pseudo code
> :t  (a :: *) -> fmap @(Either a)
forall a b c . (b -> c) -> Either a b -> Either a c 

但这仅在 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 

更简单的替代方法,使用部分类型批注。

> :t fmap @(Either _)
fmap @(Either _) :: (a -> b) -> Either t a -> Either t b

最新更新