繁体   English   中英

功能箭头右侧的forall是什么意思?

[英]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

看出差别,可以实例化agInt ,从而可以传递类型的函数Int -> Int至g。 另一方面, f的参数必须被普遍量化(由函数类型之前的forall指定)并且应该适用于所有类型(这样的函数的示例是id )。

是对更高等级类型的一个很好的解释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM