快速示例:
{-# LANGUAGE RankNTypes #-}
l :: (forall b. [b] -> [b]) -> Int
l f = 3
l1 :: forall a. a -> a
l1 x = x
l2 :: [Int] -> [Int]
l2 x = x
k :: ((forall b. [b] -> [b]) -> Int) -> Int
k f = 3
k1 :: (forall a. a -> a) -> Int
k1 x = 99
k2 :: ([Int] -> [Int]) -> Int
k2 x = 1000
m :: (((forall b. [b] -> [b]) -> Int) -> Int) -> Int
m f = 3
m1 :: ((forall a. a -> a) -> Int) -> Int
m1 x = 99
m2 :: (([Int] -> [Int]) -> Int) -> Int
m2 x = 1000
这里:
l l1
类型检查l l2
不进行类型检查k k1
不进行类型检查k k2
类型检查m m1
类型检查m m2
不进行类型检查
虽然我对发生的事情完全没问题,l
但m
我不明白这k
部分。存在某种“更多态”的关系,例如,forall a. a -> a
比forall b. [b] -> [b]
因为可以替换而更多态a/[b]
。但是,如果多态类型位于逆变位置,为什么这种关系会翻转呢?
正如我所看到k
的,“一台机器可以在任何产生 Int 的列表上运行机器”。k1
是“一台机器,它采用任何产生 int 的内同态机器”。k1
因此,它提供的远比k
想要的多,为什么它不符合它的要求呢?我觉得我的推理有些错误,但我无法理解......