Haskell 函数箭头右边的forall是什么意思?

Haskell 函数箭头右边的forall是什么意思?,haskell,ghc,Haskell,Ghc,研究的主题是高阶多态性。除其他外,还有一些示例有效类型: f4 :: Int -> (forall a.a->a) 现在我想知道这种类型意味着什么。我认为这与: f4' :: forall a. Int -> a -> a 如果是这样的话,我们是否可以像上面那样(显示在最右边的箭头的右边)在思维上将所有的移到左边,假设在类型的其余部分没有出现同名的类型变量(但这可以简单地处理重命名) 例如,以下内容仍然是正确的,不是吗: f5 :: Int -> (forall

研究的主题是高阶多态性。除其他外,还有一些示例有效类型:

f4 :: Int -> (forall a.a->a)
现在我想知道这种类型意味着什么。我认为这与:

f4' :: forall a. Int -> a -> a
如果是这样的话,我们是否可以像上面那样(显示在最右边的箭头的右边)在思维上将所有的移到左边,假设在类型的其余部分没有出现同名的类型变量(但这可以简单地处理重命名)

例如,以下内容仍然是正确的,不是吗:

f5 :: Int -> (forall a. (forall b. b -> a) -> a)
f5' :: forall a. Int -> (forall b. b -> a) -> a
我很感激你能给我一个有见地的回答

背景:在这方面,我们有:

type Lens' s a = forall f. Functor f => (a -> f a) -> s -> f s
然后,当你合成它们时,结果中有这样一个镜头类型。 因此,我只是想知道我的直觉是否正确,结果中的forall实际上并不重要——它只是因为类型同义词而“意外”出现。否则,上面我想了解的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->(对于所有a.a->a)
对于所有a。Int->(a->a)
基本相同

但我们不能将你的类比应用于Rank2类型
(对于a.a->a)->(对于b.b->b)
。该类型基本上与所有b的
相同。(对于所有a.a->a)->(b->b)
。但是将第一个forall移出(
forallab.(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
要查看差异,可以将
g
中的
a
实例化为
Int
,从而可以将
Int->Int
类型的函数传递给g。另一方面,
f
的参数必须被普遍量化(由函数类型之前的所有参数指定),并且应适用于所有类型(此类函数的示例为
id


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

感谢您的详细说明。我发现我关于福尔的左移的问题可能会被误解。当然,我的意思是,只有出现在最右边的顶级箭头右边的孔。@Ingo这不是一个正确的类比,但如果返回类型是Rank1,我看不出有问题。我希望我知道“正确类比”和“基本相等”的确切意思。我想这“本质上”是我问题的关键。如果我们不能直截了当地说:它们是相等的,那么区别在哪里呢?在我的例子f5和f5中就是这样。区别在哪里?GHCi似乎按照我给f5'的格式打印f5的类型。