【发布时间】:2013-10-10 10:04:28
【问题描述】:
Section 7.12.5 of the GHC Users Guide 的主题是高阶多态性。除其他外,还有一些示例有效类型:
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
非常感谢您提供有见地的答案。
背景:在这个talk about lenses by SPJ,我们有:
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 同意我的观点,至少在这种情况下......
【问题讨论】: