Coyoneda 没有更高级别的类型,但它实际上是什么类型?
Coyoneda hasn't a higher-rank type but what type has it actually?
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
被显式量化,但量词似乎不在正确的位置来呈现类型变量等级 2。尽管如此,b
并未列在 [ 的 LHS 上=21=]声明。那是什么?几乎存在?这只是一个没有根据的猜测,因为我不太了解存在量词并假设 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
数据构造函数的结果类型中。
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
被显式量化,但量词似乎不在正确的位置来呈现类型变量等级 2。尽管如此,b
并未列在 [ 的 LHS 上=21=]声明。那是什么?几乎存在?这只是一个没有根据的猜测,因为我不太了解存在量词并假设 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
数据构造函数的结果类型中。