haskell - 这种类型是有效的 "rank-2 bifunctor"吗?

标签 haskell functor rank-n-types bifunctor

rank2classes包提供了 Functor 的版本映射函数似乎是类型构造函数之间的自然转换。
按照这个想法,这里是 Bifunctor 的 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)
但是这个Bar呢?嵌套的类型 fg :
data Bar f g = Bar (f (g Int))
首先,我们似乎需要要求 Functor prank2bimap 的签名中, 能够转换 gf .
Bar一个有效的“2 级二元仿函数”?

最佳答案

事实上,这不是你的 Bifunctor 的一个实例。 ,因为缺少约束允许您为 f 选择一个逆变仿函数然后 rank2bimap大致相当于实现 fmapf :

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' 的自由定理。 ,假设 ff'是仿函数,然后 n :: f ~> f'满足所有 phi , fmap phi . n = n . fmap phi .

关于haskell - 这种类型是有效的 "rank-2 bifunctor"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66047704/

相关文章:

Haskell 长度和滤波器确定直线的凸度或凹度

haskell - 作为脚本运行 .hs 文件时如何导入相邻模块

haskell - 为什么 `fmap` 需要在 `succ` 上调用 `Maybe Integer` ?

haskell - 组合函数时,通用量化和类型类约束会发生什么?

Haskell 使用不带 _ 的镜头记录默认值

c++ - Lambda 只是重载了 operator() 的类?

c++ - C 中的模板化仿函数。类模板与函数模板

haskell - 如何将多态函数应用于 Either 的两边?

haskell - 存在类型的类型变量引入

Haskell - 在 Applicative 的情况下,效果顺序是否确定?