[英]What does forall on the right of a function arrow mean?
GHC用户指南第7.12.5节的主题是更高级别的多态性。 有一些示例有效类型,其中包括:
f4 :: Int -> (forall a.a->a)
现在我想知道这种类型意味着什么。 我认为它是一样的:
f4' :: forall a. Int -> a -> a
如果是这样的话,我们可以大致精神上移动FORALL像上面(出现在最右边的箭头的右侧)向左假设具有相同名称的类型变量的类型其余发生(但是这可能与重命名进行处理,简单地说)?
例如,以下内容仍然是正确的,不是吗:
f5 :: Int -> (forall a. (forall b. b -> a) -> a)
f5' :: forall a. Int -> (forall b. b -> a) -> a
感谢一个有见地的答案。
背景:在SPJ关于镜头的讨论中 ,我们有:
type Lens' s a = forall f. Functor f => (a -> f a) -> s -> f s
然后,当你构成它们时,你会在结果中有这样的镜头类型。 因此,我只是想知道我的直觉是否正确,结果中的结果并不重要 - 因为同义词的类型,它只是“偶然”出现。 否则,我想要了解的f4,f4'和f5,f5'类型之间必定存在一些差异。
这是一个ghci会议:
Prelude> let f5 :: Int -> (forall a. (forall b. b -> a) -> a); f5 i f = f i
Prelude> :t f5
f5 :: Int -> (forall b. b -> a) -> a
Prelude>
看起来GHC同意我的意见,至少在这种情况下......
你的例子中的f4
可以被普遍量化,因为Int -> (forall a. a -> a)
和forall a. Int -> (a -> a)
forall a. Int -> (a -> a)
基本相同。
但是我们不能在这个Rank2类型中使用类比(forall a. a -> a) -> (forall b. b -> b)
a。a (forall a. a -> a) -> (forall b. b -> b)
b.b (forall a. a -> a) -> (forall b. b -> b)
。 这种类型与forall b. (forall a. a -> a) -> (b -> b)
基本相同forall b. (forall a. a -> a) -> (b -> b)
forall b. (forall a. a -> a) -> (b -> b)
。 但是移动第一个forall( forall a b. (a -> a) -> (b -> b)
)实质上改变了该类型的语义。
f :: (forall a. a -> a) -> (forall b. b -> b) -- Rank 2
g :: forall a b. (a -> a) -> (b -> b) -- Rank 1
看出差别,可以实例化a
在g
为Int
,从而可以传递类型的函数Int -> Int
至g。 另一方面, f
的参数必须被普遍量化(由函数类型之前的forall指定)并且应该适用于所有类型(这样的函数的示例是id
)。
这是对更高等级类型的一个很好的解释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.