【发布时间】:2020-03-04 23:41:44
【问题描述】:
快速示例:
{-# 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 想要的要多,那么为什么它不符合它的要求呢?我觉得我的推理有些错误,但我无法理解......
【问题讨论】:
标签: haskell types polymorphism type-theory rank-n-types