我开始理解forall
关键字是如何在所谓的“存在类型”中使用的,就像这样:
data ShowBox = forall s. Show s => SB s
然而,这只是forall
如何使用的一个子集,我根本无法将它的用法包裹在这样的事情上:
runST :: forall a. (forall s. ST s a) -> a
或者解释为什么它们不同:
foo :: (forall a. a -> a) -> (Char, Bool)
bar :: forall a. ((a -> a) -> (Char, Bool))
或者整个RankNTypes
的东西…
我倾向于使用清晰、无专业术语的英语,而不是学术环境中常见的语言。我试图阅读的大部分解释(我可以通过搜索引擎找到的)都有这些问题:
runST
, foo
和bar
)。所以…
回到真正的问题上来。有人能完全解释forall
关键字清楚,简单的英语(或者,如果它存在的地方,指向这样一个明确的解释,我错过了),不假设我是一个数学家沉浸在行话?
编辑补充:
下面有两个高质量的答案,但不幸的是,我只能选择一个最好的。诺曼的回答是详细而有用的,以一种显示forall
的一些理论基础的方式解释事情,同时向我展示了它的一些实际含义。yairchu的回答涵盖了一个没有人提到的领域(作用域类型变量),并用代码和GHCi会话说明了所有的概念。如果有可能两者都选得最好,我会选。不幸的是,我不能,在仔细查看了两个答案后,我认为yairchu的答案略优于Norman的答案,因为其中有说明性代码和附带的解释。然而,这有点不公平,因为我真的需要两个答案来理解这一点,以至于当我在类型签名中看到forall
时,它不会让我有一种微弱的恐惧感。