此类型是否有效 "rank-2 bifunctor"?
Is this type a valid "rank-2 bifunctor"?
rank2classes package provides a version of Functor
映射函数似乎是类型构造函数之间的自然转换。
按照这个想法,这里是 Bifunctor
的 rank-2 版本:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE StandaloneKindSignatures #-}
import Data.Kind
type Rank2Bifunctor :: ((Type -> Type) -> (Type -> Type) -> Type) -> Constraint
class Rank2Bifunctor b where
rank2bimap ::
(forall x. p x -> p' x) -> (forall x. q x -> q' x) -> b p q -> b p' q'
似乎很清楚这种类型 Foo
可以被赋予一个 Rank2Bifunctor
实例:
data Foo f g = Foo (f Int) (g Int)
instance Rank2Bifunctor Foo where
rank2bimap tleft tright (Foo f g) = Foo (tleft f) (tright g)
但是嵌套 f
和 g
的 Bar
类型呢:
data Bar f g = Bar (f (g Int))
对于初学者来说,似乎我们需要在 rank2bimap
的签名中要求 Functor p
,以便能够转换 f
中的 g
。
Bar
是有效的“rank-2 双函子”吗?
确实这不是您的 Bifunctor
的实例,因为缺少约束允许您为 f
选择逆变函子然后 rank2bimap
大致相当于实现 fmap
对于 f
:
rank2bimap id :: (g ~> g') -> Bar f g -> Bar f g' -- covariance of f, kinda (since Bar f g = f (g Int))
type f ~> f' = (forall x. f x -> f' x)
如果您添加 f
和 g
(此处可选)是函子的要求,那么您会得到一个双函子:
rank2bimap :: (Functor f, Functor g) => (f ~> f') -> (g ~> g') -> Bar f g -> Bar f' g'
特别是,要证明双函子定律,您将需要 f ~> f'
的自由定理,假设 f
和 f'
是函子,则 n :: f ~> f'
满足对于所有 phi
、fmap phi . n = n . fmap phi
.
rank2classes package provides a version of Functor
映射函数似乎是类型构造函数之间的自然转换。
按照这个想法,这里是 Bifunctor
的 rank-2 版本:
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE StandaloneKindSignatures #-}
import Data.Kind
type Rank2Bifunctor :: ((Type -> Type) -> (Type -> Type) -> Type) -> Constraint
class Rank2Bifunctor b where
rank2bimap ::
(forall x. p x -> p' x) -> (forall x. q x -> q' x) -> b p q -> b p' q'
似乎很清楚这种类型 Foo
可以被赋予一个 Rank2Bifunctor
实例:
data Foo f g = Foo (f Int) (g Int)
instance Rank2Bifunctor Foo where
rank2bimap tleft tright (Foo f g) = Foo (tleft f) (tright g)
但是嵌套 f
和 g
的 Bar
类型呢:
data Bar f g = Bar (f (g Int))
对于初学者来说,似乎我们需要在 rank2bimap
的签名中要求 Functor p
,以便能够转换 f
中的 g
。
Bar
是有效的“rank-2 双函子”吗?
确实这不是您的 Bifunctor
的实例,因为缺少约束允许您为 f
选择逆变函子然后 rank2bimap
大致相当于实现 fmap
对于 f
:
rank2bimap id :: (g ~> g') -> Bar f g -> Bar f g' -- covariance of f, kinda (since Bar f g = f (g Int))
type f ~> f' = (forall x. f x -> f' x)
如果您添加 f
和 g
(此处可选)是函子的要求,那么您会得到一个双函子:
rank2bimap :: (Functor f, Functor g) => (f ~> f') -> (g ~> g') -> Bar f g -> Bar f' g'
特别是,要证明双函子定律,您将需要 f ~> f'
的自由定理,假设 f
和 f'
是函子,则 n :: f ~> f'
满足对于所有 phi
、fmap phi . n = n . fmap phi
.