Coyoneda没有更高等级的类型,但它实际上是什么类型?



Yoneda有一个有效的类型,只要设置了高阶扩展:

newtype Yoneda f a = Yoneda (forall b. (a -> b) -> f b),生成类型(forall b. (a -> b) -> f b) -> Yoneda f a

b是由Yoneda的消费者选择的,因此没有出现在newtype声明的LHS上。

Coyoneda,然而,对我来说没有意义:

data Coyoneda f a = forall b. Coyoneda (b -> a) (f b)生成(b -> a) -> f b -> Coyoneda f a

b是显式量化的,但量词似乎不在正确的位置来呈现类型变量rank 2。尽管如此,b并没有列在data声明的LHS上。那么它是什么呢?几乎存在?这只是一个没有根据的猜测,因为我不太了解存在量词,并且假设Haskell不支持它们。

data Coyoneda f a = forall b. Coyoneda (b -> a) (f b)

也可以用GADT语法编写:

data Coyoneda f a where
Coyoneda :: forall b. (b -> a) -> f b -> Coyoneda f a

显式量化是可选的。

Coyoneda ::               (b -> a) -> f b -> Coyoneda f a
Coyoneda :: forall f a b. (b -> a) -> f b -> Coyoneda f a

所以你做对了:b在这里是存在量化的,因为它没有出现在Coyoneda数据构造函数的结果类型中。

相关内容

  • 没有找到相关文章

最新更新