我开始了解如何在所谓的“存在types”中使用forall关键字: data ShowBox = forall s. Show s => SB s 然而,这只是一个子集,因为它是如何使用的,而我根本无法把它用在这样的事情上: runST :: forall a. (forall s. ST sa) -> a 或者解释为什么这些不同: foo :: (forall a. a -> a) -> (Char,Bool) bar :: forall a. ((a -> a) -> (Char, Bool)) 或者整个RankNTypes东西… 我倾向于select清晰,不含行话的英语,而不是学术环境中正常的语言。 我试图阅读的大部分解释(我可以通过search引擎find的)有这些问题: 他们不完整。 他们解释了使用这个关键字(比如“存在types”)的一部分,这让我感觉很开心,直到我读完以不同的方式使用它的代码(比如runST , foo和bar )。 他们密集的假设,我已阅读离散math的任何分支,类别理论或抽象代数本周stream行的最新。 (如果我再也不读“实施细节咨询文件”,那就太快了。) 他们的写作方式经常会把简单的概念变成扭曲和破碎的语法和语义。 所以… 谈到实际的问题。 […]