GHCi 语法显示类型 class 函数的特化
GHCi syntax to display specializations of type class functions
命令:set -XTypeApplications
后我们可以使用GHCi来显示
特定实例的 class 类型函数的特化。
一个简单的例子:
:type fmap @Maybe
GHCi 回复
fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b
问题:具有两个(或更多)多态参数的数据类型实例的语法如何?
在 Functor class 中,这些是 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
但这仅在核心中找到。
但是我们可以为此使用自定义的虚拟类型 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
命令:set -XTypeApplications
后我们可以使用GHCi来显示
特定实例的 class 类型函数的特化。
一个简单的例子:
:type fmap @Maybe
GHCi 回复
fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b
问题:具有两个(或更多)多态参数的数据类型实例的语法如何?
在 Functor class 中,这些是 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
但这仅在核心中找到。
但是我们可以为此使用自定义的虚拟类型 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